2016-08-31 28 views
2

Ich möchte eine XML Datei aus einer .csv Datei erstellen. Ich habe einige Schwierigkeiten, die gewünschte Struktur zu erhalten:Wie erstelle ich XML von .csv richtig?

<?xml version="1.0" encoding="UTF-8"?> 
<document> 
    <employee ID="1"> 
    <Name>Steve</Name> 
    <City>Boston</City> 
    <Age>33</Age> 
    </employee> 
    <employee ID="2"> 
    <Name>Michael</Name> 
    <City>Dallas</City> 
    <Age>45</Age> 
    </employee> 
    <employee ID="3"> 
    <Name>John</Name> 
    <City>New York</City> 
    <Age>89</Age> 
    </employee> 
    <employee ID="4"> 
    <Name>Thomas</Name> 
    <City>LA</City> 
    <Age>62</Age> 
    </employee> 
    <employee ID="5"> 
    <Name>Clint</Name> 
    <City>Paris</City> 
    <Age>30</Age> 
    </employee> 
</document> 

Was ich versucht habe:

library(XML) 

# Some data 
df <- 
    read.csv(textConnection('"ID","Name","City","Age" 
"1","Steve","Boston",33 
"2","Michael","Dallas",45 
"3","John","New York",89 
"4","Thomas","LA",62 
"5","Clint","Paris",30'), 
     as.is=TRUE) 

xml <- xmlTree() 
xml$addTag("document", close=FALSE) 
for (i in 1:nrow(df)) { 
    xml$addTag("employee", close=FALSE) 
    for (j in names(df)) { 
    xml$addTag(j, df[i, j]) 
    } 
    xml$closeTag() 
} 
xml$closeTag() 

die fast aussieht wie gewünscht, aber wo ID ist unter employee eher dann auf der gleichen Linie und die Codierung im Header ist nicht:

<?xml version="1.0"?> 

<document> 
    <employee> 
    <ID>1</ID> 
    <Name>Steve</Name> 
    <City>Boston</City> 
    <Age>33</Age> 
    </employee> 
    <employee> 
    <ID>2</ID> 
    <Name>Michael</Name> 
    <City>Dallas</City> 
    <Age>45</Age> 
    </employee> 
    <employee> 
    <ID>3</ID> 
    <Name>John</Name> 
    <City>New York</City> 
    <Age>89</Age> 
    </employee> 
    <employee> 
    <ID>4</ID> 
    <Name>Thomas</Name> 
    <City>LA</City> 
    <Age>62</Age> 
    </employee> 
    <employee> 
    <ID>5</ID> 
    <Name>Clint</Name> 
    <City>Paris</City> 
    <Age>30</Age> 
    </employee> 
</document> 

Antwort

2

Verwenden addNode statt addTag. Sie sind identisch

> identical(xml$addTag, xml$addNode) 
[1] TRUE 

so ist es eine Frage der Präferenz. Sie können ein attrs Argument angeben, um das ID Attribut hinzuzufügen. Sie können beim Speichern der Datei die Codierung hinzufügen:

library(XML) 
df <- 
    read.csv(textConnection('"ID","Name","City","Age" 
          "1","Steve","Boston",33 
          "2","Michael","Dallas",45 
          "3","John","New York",89 
          "4","Thomas","LA",62 
          "5","Clint","Paris",30'), 
      as.is=TRUE) 

xml <- xmlTree("document") 
for (i in 1:nrow(df)) { 
    xml$addNode("employee", attrs = c(ID = df[i,"ID"]), close = FALSE) 
    appNames <- names(df)[names(df) != "ID"] 
    for (j in appNames) { 
    xml$addNode(j, df[i, j]) 
    } 
    xml$closeNode() 
} 
xml$closeNode() 
saveXML(xml$doc(), "text.xml", encoding = "UTF-8") 
xmlParse("text.xml") 
<?xml version="1.0" encoding="UTF-8"?> 
<document> 
    <employee ID="1"> 
    <Name>Steve</Name> 
    <City>Boston</City> 
    <Age>33</Age> 
    </employee> 
    <employee ID="2"> 
    <Name>Michael</Name> 
    <City>Dallas</City> 
    <Age>45</Age> 
    </employee> 
    <employee ID="3"> 
    <Name>John</Name> 
    <City>New York</City> 
    <Age>89</Age> 
    </employee> 
    <employee ID="4"> 
    <Name>Thomas</Name> 
    <City>LA</City> 
    <Age>62</Age> 
    </employee> 
    <employee ID="5"> 
    <Name>Clint</Name> 
    <City>Paris</City> 
    <Age>30</Age> 
    </employee> 
</document> 
+0

Vielen Dank! Darf ich Sie eine letzte Frage stellen? Ist es möglich, die Leistung Ihrer Funktion zu erhöhen, indem Sie beispielsweise Listen verwenden? Ich nehme an, dass Schleifen über große '.csv' eine Weile dauern würden. – Googme

Verwandte Themen