2009-02-26 12 views
1

Ich schreibe eines meiner ersten C# -Programme. Hier ist, was ich versuche zu tun:Festlegen von Attributen in einem XML-Dokument

  • öffnen Sie ein XML-Dokument
  • Navigieren Sie zu einem Teil der XML-Struktur und wählen Sie alle untergeordneten Elemente vom Typ <myType>
  • Für jedes <myType> Element, ein Attribut ändern (so würde <myType id="oldValue"> werden <myType id="newValue">
  • schreiben dieser geänderte XML-Dokument in eine Datei.

fand ich die XmlDocument.SelectNodes Methode, die einen XPath-Ausdruck als Argument verwendet. Es gibt jedoch eine XmlNodeList zurück. Ich lese ein wenig über den Unterschied zwischen einem XML-Knoten und einem XML-Element, und dies scheint zu erklären, warum es keine XmlNode.SetAttribute Methode gibt. Aber gibt es eine Möglichkeit, dass ich meinen XPath-Ausdruck verwenden kann, um eine Liste von XmlElement Objekten abzurufen, so dass ich diese Liste durchlaufen kann und die id Attribute für jedes festlegen kann?

(Wenn es eine andere Art und Weise einfacher ist, kann man mich nicht wissen lassen.)

Antwort

2

einfach - es nicht wissen, ob Sie ein Element oder Attribut lesen. Durchaus möglich, alles, was Sie brauchen, ist ein gegossenes hier:

foreach(XmlElement el in doc.SelectNodes(...)) { 
    el.SetAttribute(...); 
} 

Die Select eine XmlNodeList zurückgibt, aber die oben behandelt jeden als XmlElement.

+0

Das funktioniert gut. Und das ist im Allgemeinen sicher, denn wenn Sie eine XPath-Abfrage schreiben möchten, die mehr als einen Knotentyp zurückgibt, müssen Sie daran arbeiten. –

+0

@Robert - nun, es könnte ein Attribut oder ein Textknoten sein; der xpath wäre ziemlich ähnlich ... aber in diesem Fall gibt das OP an, dass sie Elemente lesen; * Das * ist, was es sicher macht. –

0

Ich bin an meinem Mac sitze, so dass kein .NET für mich ...

Aber ich denke, dass Sie einen XmlNode zu einem XmlElement über eine explizite Umwandlung werfen können.

Sie sollten in der Lage sein, das XmlElement dann in einen XmlNode zu casten und seine untergeordneten Knoten mit etwas wie XmlNode.ChildNodes zu erhalten.

1

Ich bin ein großer Fan von System.Xml.Linq.XDocument und die Funktionen, die es bietet.

Option 1 oder 2 funktioniert, aber ich bevorzuge 2, denn wenn das Attribut nicht existiert, wird es es schaffen.

+0

Danke; Ich werde das überprüfen. Sieht sehr praktisch aus. – RexE

Verwandte Themen