Gå til innhold

C#: Hvordan slå sammen XML filer med lik struktur [LØST]


Gjest Slettet-qfohT7

Anbefalte innlegg

Gjest Slettet-qfohT7

Jeg har søkt litt på nettet angående dette, men det var en god del forsjellige løsninger på problemet, så ble en smule forvirret, og håpet at noen kunne dirigere meg inn på riktig spor her.

 

Problemet er som følger:

 

Jeg har to XML filer med lik struktur, som ser slik ut:

 

- <PROJECT>
- <HARDWARE>
<NAME>Hardware_name_1</NAME> 
blahblah...
- <SLAVE>
   <NAME>Slave_name_1</NAME> 
  	blahblah...
  </SLAVE>
  </HARDWARE>
 </PROJECT>

 

og

 

- <PROJECT>
- <HARDWARE>
<NAME>Hardware_name_2</NAME> 
blahblah...
- <SLAVE>
   <NAME>Slave_name_2</NAME> 
  	blahblah...
  </SLAVE>
  </HARDWARE>
 </PROJECT>

 

Jeg ønsker at alt "HARDWARE" nivået skal flyttes over, slik at resultatet blir slik:

 

- <PROJECT>
- <HARDWARE>
<NAME>Hardware_name_1</NAME> 
blahblah...
- <SLAVE>
   <NAME>Slave_name_1</NAME> 
  	blahblah...
  </SLAVE>
  </HARDWARE>
- <HARDWARE>
<NAME>Hardware_name_2</NAME> 
blahblah...
- <SLAVE>
   <NAME>Slave_name_2</NAME> 
  	blahblah...
  </SLAVE>
  </HARDWARE>
 </PROJECT>

 

Har bla.a sett på dette eksemplet, uten at det hjalp noe særlig.

 

Jeg har aldri jobbet med XML før, so please go easy =)

Bruker SharpDevelop v2.2 som ikke støtter .NET framework 3 og 3.5, så hvis jeg trenger dette si gjerne fra. Da må jeg oppgradere til siste versjon først.

 

Så hvis noen kan hjelpe meg i riktig retning er jeg veldig takknemlig.

 

/T

Endret av Slettet-qfohT7
Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet-qfohT7

Etter en del om og men, så fikk jeg det til å virke med AppendChild og en for-each løkke.

 

Takk skal du ha

Lenke til kommentar
Gjest Slettet-qfohT7

Hmm..du har nok kanskje rett i at DOM ikke er helt optimal =) Jeg støtte på noe så banalt enkelt som å forandre verdi på en av "attributtene" eller hva det nå heter, men får feil uansett hva jeg gjør. Kan noen fortelle meg hva som er galt med dette ? (Jeg skal forandre attributten som ligger under <PROJECT> - <HARDWARE> og så ser linja slik ut : <INDEX>0</INDEX>)

 

 

System.Xml.XmlDocument oDocFirst = new XmlDocument(); 
oDocFirst.Load(openFileDialog1.FileName); 

System.Xml.XmlDocument oDocSecond = new XmlDocument(); 
oDocSecond.Load(openFileDialog2.FileName); 

oDocSecond.DocumentElement.ChildNodes[0].Attributes[0].InnerText = "1";

XmlNode oNodeWhereInsert = oDocFirst.SelectSingleNode("/PROJECT"); 

foreach( XmlNode oNode in oDocSecond.SelectNodes("/PROJECT/HARDWARE")) 
{ 
oNodeWhereInsert.AppendChild( oDocFirst.ImportNode(oNode,true) ); 
} 

oDocFirst.Save("Project_merged.xml");

 

Kodelinje nr.4 er hva jeg har forsøkt meg på etter litt googling, men som langt ifra virker..

Endret av Slettet-qfohT7
Lenke til kommentar

XmlDocument doc1 = new XmlDocument();
XmlDocument doc2 = new XmlDocument();

doc1.LoadXml("<documentelement><element attribute=\"aval1\">value1</element><element attribute=\"aval2\">value2</element></documentelement>");
doc2.LoadXml("<documentelement><element attribute=\"aval3\">value3</element><element attribute=\"aval4\">value4</element></documentelement>");

foreach (XmlNode childNode in doc2.DocumentElement.ChildNodes)
{
XmlNode node = doc1.ImportNode(childNode, true);
node.Attributes["attribute"].Value = "newAval";
node.InnerText = "newValue";
doc1.DocumentElement.AppendChild(node);			   
}
Console.WriteLine(doc1.OuterXml);
Console.ReadKey();

 

Resultat

<documentelement>
<element attribute="aval1">value1</element>
<element attribute="aval2">value2</element>
<element attribute="newAval">newValue</element>
<element attribute="newAval">newValue</element>
</documentelement>

 

Ingen grunn til å bruke XPath for å finne fram til de nodene du er på utkikk etter. DocumentElement er alltid rot noden i et xml dokument, og ChildNodes av denne er naturligvis xml elementene direkte under roten.

Lenke til kommentar
Gjest Slettet-qfohT7
Ingen grunn til å bruke XPath for å finne fram til de nodene du er på utkikk etter. DocumentElement er alltid rot noden i et xml dokument, og ChildNodes av denne er naturligvis xml elementene direkte under roten.

 

Ah, supert. Jeg blandet bare noder og attributter. Selv om det ikke har undernivåer, er det fortsatt noder. Det funket nå fint med en litt modifisert linje:

 

oDocSecond.DocumentElement.ChildNodes[0].ChildNodes[7].InnerText ="1";

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...