在XMLNodeSet上使用getNodeSet(XML包)

时间:2015-01-07 14:35:04

标签: xml r

我无法将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]]像新文档一样工作。

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"