我无法将R XML包用于我想到的特定应用程序。请考虑以下示例文档。我有兴趣在第一个节点内获取b中的信息。但我的问题(应用程序)的本质是,我首先需要来识别文档中的所有节点,然后将此节点集子集化以获得第一个节点,然后获取b节点。第一步很简单:
doc <- "
<div></div>
<a id='1'><b id='3'>text1</b></a>
<a id='2'><b id='4'>text2</b></a>
"
parsed <- htmlParse(doc)
step1 <- getNodeSet(parsed, "//a")
> step1
[[1]]
<a id="1">
<b id="3">text1</b>
</a>
[[2]]
<a id="2">
<b id="4">text2</b>
</a>
attr(,"class")
[1] "XMLNodeSet"
这产生了预期的结果。我的应用程序的下一步是从第一个节点中提取b节点。如果我在step1 [[1]]上使用getNodeSet,我会从step1节点集中的两个节点获取b节点。
step2 <- getNodeSet(step1[[1]], "//b")
step2
[[1]]
<b id="3">text1</b>
[[2]]
<b id="4">text2</b>
attr(,"class")
[1] "XMLNodeSet"
我发现我可以使用XPath“b”获取此示例中的信息,但最终我需要“// b”才能在这里工作。我理解XML包的方式有效,我不认为这种行为是一个错误,而是该文档的C级表示的引用的结果。有没有办法可以通过任何方式实现这个“两步”过程?我基本上希望步骤[[1]]像新文档一样工作。
答案 0 :(得分:1)
有许多方法可用于实现您想要的效果。首先,您可以调整XPATH:
doc <- "
<div></div>
<a id='1'><b id='3'>text1</b></a>
<a id='2'><b id='4'>text2</b></a>
"
parsed <- htmlParse(doc)
parsed["//a[1]/b"]
> parsed["//a[1]/b"]
[[1]]
<b id="3">text1</b>
attr(,"class")
[1] "XMLNodeSet"
如果您需要在step1
工作,可以在XPATH中使用相对引用:
step1 <- getNodeSet(parsed, "//a")
getNodeSet(step1[[1]], "./b")
> getNodeSet(step1[[1]], "./b")
[[1]]
<b id="3">text1</b>
attr(,"class")
[1] "XMLNodeSet"
要使用step1[[1]]
,好像它是一个新的XML文档,有两种方法可能适合:
mydoc2 <- xmlParse(saveXML(step1[[1]]))
> mydoc2["//b"]
[[1]]
<b id="3">text1</b>
attr(,"class")
[1] "XMLNodeSet"
可能更好的是:
mydoc3 <- xmlDoc(step1[[1]])
> mydoc3["//b"]
[[1]]
<b id="3">text1</b>
attr(,"class")
[1] "XMLNodeSet"