如何在R中读取xml的特定属性

时间:2017-10-05 08:16:51

标签: r xml

下面是我需要解析的示例XML文件。这只是文件原始文件的一部分非常大。但格式总是一样的。

我想只解析这些值并将其放在数据框中。

<Property Name="Entity1ID" Type="Edm.String">
      <Annotation Term="test.Label">
             <String>IDENTIFIER</String>
      </Annotation>
</Property>

所以在数据帧中我应该拥有像这样的所有值

Entity1ID -> IDENTIFIER
ID -> FILEID
Entity2ID -> ID

依旧......

大约有10个EntityType和1000个属性标记,我只需要解析属性标记并映射值。

我无法解析这些值。我知道这将是一个小程序,但我是R的新手。

先谢谢。

<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
    <edmx:Data>
        <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="test.Models" Alias="test">
            <EntityType Name="Entity1">
                <Key>
                    <PropertyRef Name="ID"/>
                </Key>
                <Property Name="Entity1ID" Type="Edm.String">
                    <Annotation Term="test.Label">
                        <String>IDENTIFIER</String>
                    </Annotation>
                </Property>
                <Property Name="ID" Type="Edm.String">
                    <Annotation Term="test.Label">
                        <String>FILEID</String>
                    </Annotation>
                </Property>
                <NavigationProperty Name="Subjects" Type="Collection(test.Subjects)"/>

            </EntityType>
            <EntityType Name="Entity2">
                <Key>
                    <PropertyRef Name="Entity2ID"/>
                </Key>
                <Property Name="Entity2ID" Type="Edm.String">
                    <Annotation Term="test.Label">
                        <String>ID</String>
                    </Annotation>
                </Property>
            </EntityType>
            <Function Name="GetData" EntitySetPath="asphalt/Entity2" IsBound="true">
                <Parameter Name="asphalt" Type="test.asphalt" Nullable="false"/>
                <Parameter Name="ID" Type="Edm.String"/>
                <ReturnType Type="Collection(test.Entity2)" Nullable="false"/>
            </Function>

            <Term Name="Label" Type="Edm.String"/>
            <EntityContainer Name="API">
                <EntitySet Name="Studies" EntityType="test.Entity1"/>
            </EntityContainer>
        </Schema>
    </edmx:Data>
</edmx:Edmx>

1 个答案:

答案 0 :(得分:1)

希望这有帮助!

library(xml2)
library(dplyr)

#test.xml is the file having XML data
xml_doc <- read_xml("test.xml")

Value <- xml_doc %>% 
  xml_find_all("//edmx:Data/d1:Schema/d1:EntityType/d1:Property/d1:Annotation/d1:String", ns=xml_ns(xml_doc)) %>% 
  xml_text()
Key <- xml_doc %>% 
  xml_find_all("//edmx:Data/d1:Schema/d1:EntityType/d1:Property", ns=xml_ns(xml_doc)) %>% 
  xml_attr("Name")

df <- data.frame(Key, Value)
df

输出

        Key      Value
1 Entity1ID IDENTIFIER
2        ID     FILEID
3 Entity2ID         ID