如何处理R XML中的0长度字符向量
我正在解析来自web服务的XML文件,然后将其转换为data.frame。在这里,我列出了我的示例代码,它实际上是我的直接副本 我承认我对XML文件的使用相当陌生,但我需要将其解析为数据框架如何处理R XML中的0长度字符向量,xml,r,xml-parsing,dataframe,Xml,R,Xml Parsing,Dataframe,我正在解析来自web服务的XML文件,然后将其转换为data.frame。在这里,我列出了我的示例代码,它实际上是我的直接副本 我承认我对XML文件的使用相当陌生,但我需要将其解析为数据框架 library(RCurl) library(XML) xml.url <-('webservice url that links to an XML document') xml.file <- xmlTreeParse(xml.url) xmlto
library(RCurl)
library(XML)
xml.url <-('webservice url that links to an XML document')
xml.file <- xmlTreeParse(xml.url)
xmltop <- xmlRoot(xml.file)
Data <- xmlSApply(xmltop,function(x) xmlSApply(x,xmlValue))
Data <- data.frame(t(Data),row.names=NULL)
除了数据帧中的列表中的0个字符长度向量外,其他都很好。我假设,因为XML文件的解析器检测到它们,所以它必须以列表的形式存储它们,然后将列表包装在数据帧中,否则向量的长度将不相同,并且将是错误的。我更愿意设置一个选项,将它们转换为NA或只是“”,并且只要有一个向量的数据帧,而不是列表,如果可能的话,甚至可以将每个列格式化为适当的格式。主要是因为我需要在列之间编写逻辑测试
我习惯于处理类似这样的结构
> Data[,"Description_of_location"]
[1]""
[2]"By swisspark nursing home"
[3]""
[4]""
相反,我得到了
> Data[,"Description_of_location"]
$row
character(0)
$row
[1] "By swisspark nursing home"
$row
character(0)
$row
character(0)
下面是XML文档的一个示例
-<data version="1.0">
-<row>
<start type="JAVA_ROSA_DATETIME">05/11/2014 06:59:48 UTC</start>
<end type="JAVA_ROSA_DATETIME">05/11/2014 14:16:23 UTC</end>
<today type="JAVA_ROSA_DATE">05/11/2014</today>
-<deviceid type="STRING">
<![CDATA[358870052616368]]>
</deviceid>
-<subscriberid type="STRING">
<![CDATA[404310209661081]]>
</subscriberid>
-<simid type="STRING">
<![CDATA[89913100002096610814]]>
</simid>
-<phonenumber type="STRING">
<![CDATA[918420272664]]>
</phonenumber>
-<mobilekey type="STRING">
<![CDATA[ag9zfmRlbGFndWFtb2JpbGVyFwsSCk1vYmlsZVVuaXQYgICAgMD6-wkM]]>
</mobilekey>
-<projectkey type="STRING">
<![CDATA[ag9zfmRlbGFndWFtb2JpbGVyFAsSB1Byb2plY3QYgICAgKD9hQkM]]>
</projectkey>
-<recordid type="STRING">
<![CDATA[mannaenergy$$05082014141658$$Published&&12]]>
</recordid>
<Record_Name type="STRING"/>
<Watersource_GPS_Cords type="GEOPOINT">22.****:88.****:0.0:26.0</Watersource_GPS_Cords>
-<State_Name type="STRING">
<![CDATA[West Bengal]]>
</State_Name>
-<District_Name type="STRING">
<![CDATA[Kolkata]]>
</District_Name>
-<Block_Name type="STRING">
<![CDATA[Bikram]]>
</Block_Name>
-<Panchayat_Name type="STRING">
<![CDATA[Ashok nagar]]>
</Panchayat_Name>
-<Village_Name type="STRING">
<![CDATA[East lake]]>
</Village_Name>
-<Habitation_Name type="STRING">
<![CDATA[Merlin colony]]>
</Habitation_Name>
-<Unique_water_source_ID type="STRING">
<![CDATA[15]]>
</Unique_water_source_ID>
<Description_of_location type="STRING"/>
-<Type_of_Water_Source type="STRING">
<![CDATA[Public_tap]]>
</Type_of_Water_Source>
<Take_a_sample_for_chemical_tes type="STRING"/>
<Turbidity_TU_input type="STRING"/>
<Turbidity_FAU_input type="DECIMAL"/>
<Turbidity_FAU_range type="STRING"/>
<Warning_turb_FAU type="INTEGER"/>
<Turbidity_NTU_input type="DECIMAL">0.95</Turbidity_NTU_input>
-<Turbidity_NTU_range type="STRING">
<![CDATA[In_range]]>
</Turbidity_NTU_range>
<Warning_turb_NTU type="INTEGER"/>
-
-
2014年11月5日06:59:48 UTC
2014年11月5日14:16:23 UTC
05/11/2014
-
-
-
-
-
-
-
22.****:88.****:0.0:26.0
-
-
-
-
-
-
-
-
0.95
-
我很抱歉,如果这是信息过载,我试图提供一切我能想到的,将被证明是有用的
总而言之。我试图解析这个XML文件,使0长度的字符向量在数据帧中变为空白或NA元素。如果我可以在数据框中的每列结构中反映每列的类型,那就有好处了。希望这足够清楚
非常感谢您提供的一切帮助。查看后
useInternalNodes=TRUE
完全满足了我的要求
xml.file <- xmlTreeParse(xml.url,useInternalNodes = TRUE)
xmltop <- xmlRoot(xml.file)
Data <- xmlSApply(xmltop,function(x) xmlSApply(x,xmlValue))
Data <- data.frame(t(Data),row.names=NULL,stringsAsFactors=FALSE)
-<data version="1.0">
-<row>
<start type="JAVA_ROSA_DATETIME">05/11/2014 06:59:48 UTC</start>
<end type="JAVA_ROSA_DATETIME">05/11/2014 14:16:23 UTC</end>
<today type="JAVA_ROSA_DATE">05/11/2014</today>
-<deviceid type="STRING">
<![CDATA[358870052616368]]>
</deviceid>
-<subscriberid type="STRING">
<![CDATA[404310209661081]]>
</subscriberid>
-<simid type="STRING">
<![CDATA[89913100002096610814]]>
</simid>
-<phonenumber type="STRING">
<![CDATA[918420272664]]>
</phonenumber>
-<mobilekey type="STRING">
<![CDATA[ag9zfmRlbGFndWFtb2JpbGVyFwsSCk1vYmlsZVVuaXQYgICAgMD6-wkM]]>
</mobilekey>
-<projectkey type="STRING">
<![CDATA[ag9zfmRlbGFndWFtb2JpbGVyFAsSB1Byb2plY3QYgICAgKD9hQkM]]>
</projectkey>
-<recordid type="STRING">
<![CDATA[mannaenergy$$05082014141658$$Published&&12]]>
</recordid>
<Record_Name type="STRING"/>
<Watersource_GPS_Cords type="GEOPOINT">22.****:88.****:0.0:26.0</Watersource_GPS_Cords>
-<State_Name type="STRING">
<![CDATA[West Bengal]]>
</State_Name>
-<District_Name type="STRING">
<![CDATA[Kolkata]]>
</District_Name>
-<Block_Name type="STRING">
<![CDATA[Bikram]]>
</Block_Name>
-<Panchayat_Name type="STRING">
<![CDATA[Ashok nagar]]>
</Panchayat_Name>
-<Village_Name type="STRING">
<![CDATA[East lake]]>
</Village_Name>
-<Habitation_Name type="STRING">
<![CDATA[Merlin colony]]>
</Habitation_Name>
-<Unique_water_source_ID type="STRING">
<![CDATA[15]]>
</Unique_water_source_ID>
<Description_of_location type="STRING"/>
-<Type_of_Water_Source type="STRING">
<![CDATA[Public_tap]]>
</Type_of_Water_Source>
<Take_a_sample_for_chemical_tes type="STRING"/>
<Turbidity_TU_input type="STRING"/>
<Turbidity_FAU_input type="DECIMAL"/>
<Turbidity_FAU_range type="STRING"/>
<Warning_turb_FAU type="INTEGER"/>
<Turbidity_NTU_input type="DECIMAL">0.95</Turbidity_NTU_input>
-<Turbidity_NTU_range type="STRING">
<![CDATA[In_range]]>
</Turbidity_NTU_range>
<Warning_turb_NTU type="INTEGER"/>
xml.file <- xmlTreeParse(xml.url,useInternalNodes = TRUE)
xmltop <- xmlRoot(xml.file)
Data <- xmlSApply(xmltop,function(x) xmlSApply(x,xmlValue))
Data <- data.frame(t(Data),row.names=NULL,stringsAsFactors=FALSE)
str(Data[,1])
chr [1:4] "05/11/2014 06:59:48 UTC" "05/11/2014 06:45:59 UTC" "05/11/2014 06:26:16 UTC" "05/11/2014 06:52:42 UTC"