在R中使用Xpath正则表达式



我正在尝试使用r匹配一组XML节点。节点的结构是名称#。我知道这可以很容易地与正则表达式匹配,但我似乎不能让它在r中工作。下面是一个例子。

要匹配的节点:

<matrix4>...</matrix>
<matrix5>...</matrix>
<matrix2>...</matrix>

我正在使用XML包访问节点:

library("XML")
...
getNodeSet(head_node, ".//matrix2|.//matrix4|.//matrix5")

我一直在尝试使用匹配功能,但我似乎可以让它工作。我不确定R是否支持匹配。

如前所述,您不能使用正则表达式,但可以生成不同的路径字符串。

doc <- xmlParse("<set>
  <matrixA>...</matrixA>
  <matrix2>...</matrix2>
  <matrixC>...</matrixC>
  <matrix421>...</matrix421>
  <matrix55>...</matrix55>
</set>")
#exact numbers matching matrix2, 4 or 5
getNodeSet(doc, paste0("//matrix", c(2,4,5)))
[[1]]
<matrix2>...</matrix2> 
#matching ANY Number
getNodeSet(doc, paste0("//*[starts-with(name(), 'matrix", 0:9, "')]"))
[[1]]
<matrix2>...</matrix2> 
[[2]]
<matrix421>...</matrix421> 
[[3]]
<matrix55>...</matrix55> 
# or maybe use a regular expression on the names and then index
n <-grep("matrix[0-9]", xpathSApply(doc, "//set/*", xmlName))
getNodeSet(doc, "//set/*")[n]

这里有两种不使用正则表达式的方法:

# with XML ----------------------------------------------------------------
library(XML)
doc <- xmlParse("<set>
<matrix4>...</matrix4>
<matrix5>...</matrix5>
<matrix2>...</matrix2>
</set>")
# a bit generic (i.e. useless if you need to only choose certain "matrix" tags)
getNodeSet(doc, "//*[starts-with(name(), 'matrix')]")
## [[1]]
## <matrix4>...</matrix4> 
## 
## [[2]]
## <matrix5>...</matrix5> 
## 
## [[3]]
## <matrix2>...</matrix2> 
## 
## attr(,"class")
## [1] "XMLNodeSet"
# closer to what you need
getNodeSet(doc, "//*[name()='matrix4' or name()='matrix2']")
## [[1]]
## <matrix4>...</matrix4> 
## 
## [[2]]
## <matrix2>...</matrix2> 
## 
## attr(,"class")
## [1] "XMLNodeSet"
# with xml2 ---------------------------------------------------------------
library(xml2)
doc <- read_xml("<set>
<matrix4>...</matrix4>
<matrix5>...</matrix5>
<matrix2>...</matrix2>
</set>")
# a bit generic (i.e. useless if you need to only choose certain "matrix" tags)
xml_find_all(doc, "//*[starts-with(name(), 'matrix')]")
## {xml_nodeset (3)}
## [1] <matrix4>...</matrix4>
## [2] <matrix5>...</matrix5>
## [3] <matrix2>...</matrix2>
# closer to what you need    
xml_find_all(doc, "//*[name()='matrix4' or name()='matrix2']")
## {xml_nodeset (2)}
## [1] <matrix4>...</matrix4>
## [2] <matrix2>...</matrix2>

最新更新