当多个节点具有相同名称时,将XML解析为R.

时间:2016-11-06 15:52:13

标签: r xml

我有一个XML文件,其节点具有相同的名称,我无法找到如何选择我想要的数据来创建数据帧。我是R和XML的新手,我似乎无法使其发挥作用!

我的XML看起来像这样(只是开头):

<GL_Document xmlns="">
    <time_Period.timeInterval>...</time_Period.timeInterval>
    <TimeSeries>
        <mRID>1</mRID>
        <MktPSRType>
            <psrType>ProdType1</psrType>
        </MktPSRType>
        <Period>
            <timeInterval>
                <start>2015-12</start>
                <end>2016-11</end>
            </timeInterval>
            <resolution>PT60M</resolution>
            <Point>
                <position>1</position>
                <quantity>9</quantity>
            </Point>
            <Point>
                <position>2</position>
                <quantity>7</quantity>
            </Point>
            <Point>
                <position>3</position>
                <quantity>9</quantity>
            </Point>

代码包含名为&#34; TimeSeries&#34;的不同节点。使用相同类型的数据(此处不开发Period以查看整个结构)

<GL_Document xmlns="">
    <time_Period.timeInterval>...</time_Period.timeInterval>
    <TimeSeries>
        <mRID>1</mRID>
        <MktPSRType>
            <psrType>ProdType1</psrType>
        </MktPSRType>
        <Period>...</Period>
    </TimeSeries>
    <TimeSeries>
        <mRID>2</mRID>
        <MktPSRType>
            <psrType>ProdType2</psrType>
        </MktPSRType>
        <Period>...</Period>
    </TimeSeries>
    <TimeSeries>...</TimeSeries>
    <TimeSeries>...</TimeSeries>
    <TimeSeries>...</TimeSeries>
    <TimeSeries>...</TimeSeries>
    <TimeSeries>...</TimeSeries>
</GL_Document>

我想以下列格式获取数据:

psrType    position   quantity  
ProdType1   1         9
...        ...        ...
ProdType2   1         ...

我尝试应用此帖中提到的解决方案:How to parse XML to R data frame 但没有成功。 我的代码看起来像这样,但我得到的数据帧不包含数据:

xml.url3<-getURL(xml.file3)
doc<-xmlParse(xml.url3)

position_path<-"//GL_Document/TimeSeries/Period/Point/position"
quantity_path<-"//GL_Document/TimerSeries/Period/Point/quantity"

df<-data.frame(
  pos=as.integer(sapply(doc[position_path],as,"integer")),
  quant=as.integer(sapply(doc[quantity_path],as,"integer")))

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

考虑使用XML xpathSApply()来运行直接的XPath表达式。对于 psrType 值,请使用ancestor::* data.frame()将每个<TimeSeries>的一个值映射到 period 量:

library(XML)

xml.url3 <- getURL(xml.file3)
doc <- xmlParse(xml.url3)

period <- xpathSApply(doc, "//Point/position", xmlValue)
quantity <- xpathSApply(doc, "//Point/quantity", xmlValue)
psrType <- xpathSApply(doc, "//Point/ancestor::TimeSeries/MktPSRType/psrType", xmlValue)

df <- data.frame(psrType = psrType,
                 period = as.integer(period),
                 quantity = as.integer(quantity))

df
#     psrType period quantity
# 1 ProdType2      1        9
# 2 ProdType2      2        7
# 3 ProdType2      3        9

答案 1 :(得分:0)

我想你可能会在这里找到你需要的东西: How to transform XML data into a data.frame?

xmlToList()看起来是正确的。然后,您可以使用其中一种apply方法将其放入数据框架中。在上面的链接有一个grea解释!