Προς το περιεχόμενο

C# ανάγνωση XML με XMLDocument


bnvdarklord

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα

 

Έχω ενα XML αρχείο της μορφής

 

><root>
<element1>
<A>AAA</A>
<B>BBB</B>
</element1>

<element2>
<A>AAA</A>
<B>BBB</B>
</element2>

...
</root>

 

Και προσπαθώ να διαβάσω τα περιεχόμενα των Α και Β αν δίνεται το εξωτερικό τους element(πχ το elemet1).

Εχω γράψει το εξής

>
XmlDocument xml = new XmlDocument();
xml.Load("xmlfile.xml");
XmlNodeList nodes = xml.GetElementsByTagName(element);
string s = nodes.Item(0).InnerXml;

 

Το οποίο στο s επιστρέφει ολόκληρο το περιεχόμενο του element. Πως θα ξεχωρίσω τα περιεχόμενο των <A> και <B>;

Δημοσ.

Ενδιαφέρον που πέρνω αυτό τοτε:

 

Error 1 'System.Xml.XmlNodeList' does not contain a definition for 'ChildNodes' and no extension method 'ChildNodes' accepting a first argument of type 'System.Xml.XmlNodeList' could be found (are you missing a using directive or an assembly reference?)

Δημοσ.

To πρώτο που δοκίμασα, αλλα μου βγάζει οπως και το Item(0) και τα περιεχόμενα του Α και του Β. Δηλαδη ΑΑΑΒΒΒ. nodes[1] και μετα δεν υπαρχει...

Δημοσ.

>XmlDocument doc = new XmlDocument();
doc.Load(@"a.xml");

foreach (XmlNode element in doc.DocumentElement)
{
   MessageBox.Show(element.ChildNodes[0].InnerText);
}

 

Επίσης το σωστότερο για το xml σου θα είναι όλα τα tags να λέγονται element αντί για element1, element2 κοκ.

Δημοσ.

Ναι, αλλά έτσι δεν μπορώ να ξεχωρίζω ποια ειναι στο <element3> πχ(δες original post)

 

edit:

Επίσης το σωστότερο για το xml σου θα είναι όλα τα tags να λέγονται element αντί για element1, element2 κοκ.

 

Και να τα ξεχωρίζω με id, οπότε λυνεται παραπάνω απορία μου.

 

edit2:

Ναι, το εφτιαξα, έδωσα στα elements ίδιο όνομα και τα ξεχωρίζω με id, με τον κώδικα του kagelos.

Ευχαριστώ για την βοήθεια.

Δημοσ.

Δεν χρειάζεσαι ID για να βρεις το Ν-ιοστό. Παραδείγματα για παραλλαγές του κώδικα :

 

>
           XmlDocument doc = new XmlDocument();
           doc.Load(@"a.xml");

           foreach (XmlNode element in doc.DocumentElement)
           {
               MessageBox.Show(element.ChildNodes[0].InnerText);
           }

           for (int i = 0; i < doc.DocumentElement.ChildNodes.Count; i++ )
           {
               MessageBox.Show(doc.DocumentElement.ChildNodes[i].ChildNodes[5].InnerText);
           }

           XmlNodeList elements = doc.DocumentElement.ChildNodes;
           MessageBox.Show(elements[5].ChildNodes[3].InnerText);

 

To xml σου θα έπρεπε να είναι κάπως έτσι, αντί το κάθε node να έχει άλλο όνομα :

>
<?xml version="1.0" encoding="utf-8"?>
<root>
 <element elementid="KOSTAS">
   <value>AAA</value>
   <value>BBB</value>
 </element>
 <element elementid="TAKIS">
   <value>AAA</value>
   <value>BBB</value>
 </element>
</root>

 

Μετά θα μπορούσες να χρησιμοποιήσεις XPATH :

 

>XmlDocument doc = new XmlDocument();
doc.Load(@"a.xml");

XmlNodeList elements = doc.DocumentElement.SelectNodes("element[@elementid='TAKIS']");
XmlNode takis = elements[0];

Δημοσ.

Χρειάζομαι ID γιατι δεν ξέρω οτι ειναι το Ν-οστό, ξέρω απλά οτι λέγεται <Takis> πχ(ή <element id="takis"> πλεον).

 

Αυτο με το XPATH φαινεται ευκολοτερο παντως, ισως το δοκιμασω.

Δημοσ.

Απαντάω λιγάκι αργά, αλλά την GetElementByTagName μπορείς να την χρησιμοποιήσεις και σε XmlElement, και όχι μόνο σε XmlDocument. Πρέπει να κάνεις cast τον XmlNode σε XmlElement πρώτα.

 

>
System.Xml.XmlDocument myFile = null;
System.Xml.XmlNode myNode = null;
System.Xml.XmlElement myElement = null;

myFile = new System.Xml.XmlDocument();
myFile.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\" ?><root><subnode>Here I am</subnode></root>");
myElement = (XmlElement)myFile.GetElementsByTagName("root")[0];
myNode = myElement.GetElementsByTagName("subnode")[0];

 

Έτσι δεν χρειάζεται να έχει πολύ strict δομή το xml αρχείο σου. Αυτό είναι και το νόημα του xml, δεδομένα με χαλαρή δομή.-

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...