2016-09-23 89 views
0

我有XML文件,包含37个主要文件夹,每个主要文件夹包含次要文件夹数量,每个次要文件夹包含3个地点标记。将节点插入XML文件中的某个节点使用R

我想将此节点添加到第一个主要文件夹中的第一个次要文件夹的第一个地标。

我想这样做,但有些问题面临我... 第一有我的节点,我想补充

top = newXMLNode("description") 

table = newXMLNode("table", attrs = c(width = 300, border = 1), parent = top) 
tbody <- newXMLNode("tbody",parent = table) 
tr <- newXMLNode("tr",parent = tbody) 
th <- newXMLNode("th",attrs = c(scope = "col"),scope1 = 5,parent = tr) 
th <- newXMLNode("th",attrs = c(scope = "col"),scope1 = "MD",parent = tr) 
th <- newXMLNode("th",attrs = c(scope = "col"),scope1 = "PM",parent = tr) 
tr <- newXMLNode("tr",parent = tbody) 

th <- newXMLNode("th",attrs = c(scope = "col"),scope1 = 5,parent = tr) 
th <- newXMLNode("th",attrs = c(scope = "col"),scope1 = "MD",parent = tr) 
th <- newXMLNode("th",attrs = c(scope = "col"),scope1 = "PM",parent = tr) 
tr <- newXMLNode("tr",parent = tbody) 
th <- newXMLNode("th",attrs = c(scope = "col"),scope1 =5,parent = tr) 
th <- newXMLNode("th",attrs = c(scope = "col"),scope1 = "MD",parent = tr) 
th <- newXMLNode("th",attrs = c(scope = "col"),scope1 = "PM",parent = tr) 
tbody <- newXMLNode("tbody",parent = table) 

th <- newXMLNode("img",attrs = c(src = URL,width = "700",height= "777",alt=""),parent =top) 

这里就是我想...

data <- xmlTreeParse("xml_data.xml") 
data$doc$children$Folder[[4]][[3]][[3]]$description <- top 
saveXML(data, file ="xml_data.xml") 

第一个问题是:当我在控制台中写入“data$doc$children$Folder[[4]][[3]][[3]]”时,说明节点不会出现在控制台中,当我写入“data$doc$children$Folder[[4]][[3]][[3]]$description”时,它就会出现,我不知道为什么会发生这种情况。

第二个问题是:当我使用saveXML检查是否说明是在第一个地点标记或不....出现这个错误..

Error in (function (classes, fdef, mtable) : 
    unable to find an inherited method for function ‘saveXML’ for signature ‘"XMLDocument"’ 

我搜索了这一点,我发现我应该使用data <- xmlTreeParse(Url,useInternalNodes = TRUE)。 ...但这不允许我使用data$doc$children$Folder[[4]][[3]][[3]] ...

所以请问,有没有办法将节点添加到xml文件中的这个位置?还是有解决我的问题?

here's我的xml文件。

+0

您似乎想要将HTML表格嵌入到XML文件中。你可以建议在XML文件中使用编号索引而不是元素名称path -' [[4]] [[3]] [[3]]'不容易看到吗? – Parfait

+0

我使用'[[4]] [[3]] [[3]]'....我使用这个公式,因为当我在'data $ doc $ children $ Folder'后使用$时,我只有3个选项,是其他36选项,所以第4号指示第一个主文件夹,[[3]]指示第一个次要文件夹和[[3]]指示第一个地标 –

+0

@Parfait,我发现一种方法来添加html到XML,但仍然存在的问题,我不能将XML保存到我的电脑上的文件,请告诉我,如果你知道吗? 'data $ doc $ children $ Folder [[4]] [[3]] [[3]] [[“description”]] < - top' –

回答

1

考虑使用getNodeSet找到要添加的XML片段中的特定元素,然后在定义新的孩子一定要引用新元素的父这个节点集:

data <- xmlTreeParse("xml_data.xml") 
firstplacemark <- getNodeSet(data, "/Folder/Folder[1]/Folder[1]/Placemark") 

top <- newXMLNode("description", parent = firstplacemark) 

#... same code as above 


saveXML(data, file="xml_data.xml") 

输出

<?xml version="1.0"?> 
<Folder> 
    <name>All Maps</name> 
    <visibility>0</visibility> 
    <Folder> 
    <name>Kornich ElNile</name> 
    <visibility>0</visibility> 
    <Folder> 
     <name>Kornich ElNile;Zera3y To Arcadia</name> 
     <visibility>0</visibility> 
     <Placemark> 
     <name>Directions from 30.10093 31.2401 to 30.07046 31.22686</name> 
     <visibility>0</visibility> 
     <styleUrl>#msn_ylw-pushpin0</styleUrl> 
     <LineString> 
      <tessellate>1</tessellate> 
      <coordinates> 
       31.23924,30.09923,0 31.23904,30.09886,0 
       31.23859,30.09802,0 31.23836,30.09758,0 31.23813,30.09719,0 
       31.23796000000001,30.09691,0 31.23781,30.09663,0 31.23747,30.09608,0 
       31.2371,30.09546,0 31.2351,30.09159,0 31.23495,30.09131,0 
       31.23487,30.09118,0 31.2347,30.09093,0 31.23448,30.09059,0 
       31.23437,30.09043,0 31.23428,30.09029,0 31.23422,30.09021,0 
       31.23415,30.0901,0 31.23406,30.08992,0 31.23397,30.08968,0 
       31.23387,30.08943,0 31.23373,30.08903,0 31.23359,30.08863,0 
       31.2335,30.08835,0 31.23344,30.08804,0 31.23338,30.08776,0 
       31.23332,30.08751,0 31.23321,30.08723,0 31.23313,30.08706,0 
       31.23306,30.0869,0 31.23295,30.08667,0 31.23293,30.08662,0 
       31.23281,30.08629,0 31.23273,30.08606,0 31.23272,30.086,0 
       31.23266,30.08576,0 31.23259,30.08551,0 31.23245,30.08498,0 
       31.23235,30.08466,0 31.23223,30.08428,0 31.23205,30.08388,0 
       31.23181,30.08342,0 31.23176,30.08333,0 31.23143,30.08276,0 
       31.23135,30.08261,0 31.23119,30.08228,0 31.23109,30.08202,0 
       31.23096,30.08167,0 31.2309,30.08148,0 31.23084,30.08124000000001,0 
       31.2308,30.08102,0 31.23078,30.08076,0 31.23077,30.08049000000001,0 
       31.23076,30.0803,0 31.23073,30.08011,0 31.23068,30.07991,0 
       31.23064,30.07979,0 31.23055,30.07957,0 31.23032,30.07908,0 
       31.23007,30.07857,0 31.23005,30.07854,0 31.22974,30.07796,0 
       31.22963,30.07776,0 31.22945,30.07743,0 31.22907,30.07672,0 
       31.22897,30.07651,0 31.22842,30.07561,0 31.22790000000001,30.07482,0 
       31.22782,30.07468,0 31.22758,30.07423,0 31.22754000000001,30.07415,0 
       31.22754000000001,30.07414,0 31.22751,30.07409,0 31.22744,30.0739,0 
       31.22738,30.07369,0 31.22735,30.07353,0 31.22735,30.07347,0 
       31.22731,30.07324,0 31.22729,30.073,0 31.22727,30.07256,0 
       31.22724,30.07227,0 31.22712,30.07166,0 31.22703,30.07125,0 
       31.22697000000001,30.07097,0      
      </coordinates> 
     </LineString> 
     <description> 
      <table width="300" border="1"> 
      <tbody> 
       <tr> 
       <th scope="col">5</th> 
       <th scope="col">MD</th> 
       <th scope="col">PM</th> 
       </tr> 
       <tr> 
       <th scope="col">5</th> 
       <th scope="col">MD</th> 
       <th scope="col">PM</th> 
       </tr> 
       <tr> 
       <th scope="col">5</th> 
       <th scope="col">MD</th> 
       <th scope="col">PM</th> 
       </tr> 
      </tbody> 
      <tbody/> 
      </table> 
      <img src="http://www.example.com" width="700" height="777" alt=""/> 
     </description> 
     </Placemark> 
...