2016-08-11 2 views
3

Ich arbeite mit der Deserialisierung großer XML-Dokumente. In den meisten Fällen ist das in Ordnung. Ich kümmere mich nicht um einige der Kind-Knoten weiter unten im Baum, aber sie enthalten Daten, die ich für eine mögliche spätere Verwendung erfassen möchte, aber ich möchte diese nicht vollständig deserialisieren. Ich nehme lieber den gesamten Knoten und speichere ihn als String, auf den ich später zurückkommen kann.So geben Sie das innere xml des untergeordneten Knotens als Zeichenfolge während der XML-Deserialisierung zurück

zum Beispiel, was die XML-doc unter:

<item> 
    <name>item name</name> 
    <description>some text</description> 
    <categories> 
     <category>cat 1</category> 
     <category<cat 2</category> 
    </categories> 
    <children> 
     <child> 
      <description>child description</description> 
      <origin>place of origin</origin> 
      <other> 
       <stuff>some stuff to know</stuff> 
       <things>I like things</things> 
      </other> 
     </child> 
    </children> 
</item> 

ich im anderen Knoten lesen möchten, und speichern Sie die innere XML als String (zB "< stuff> einige Sachen wissen </stuff> < dinge> Ich mag dinge </sachen> "). Sinn ergeben?

In meiner item Klasse, ich habe System.Xml.Serialization verschiedene versuche ohne Glück auf der anderen Eigenschaft Attribute wie XmlText, XmlElement usw.

Wie kann ich das erreichen? Es scheint, als wäre es eine ziemlich häufige Aufgabe.

Antwort

3

du XmlElement die XmlAnyElementAttribute mit von Deserialisieren auf ein Objekt vom Typ machen kann.

So, als Beispiel, würden diese Klassen arbeiten:

[XmlRoot("item")] 
public class Item 
{ 
    [XmlElement("name")] 
    public string Name { get; set; } 

    [XmlElement("description")] 
    public string Description { get; set; } 

    [XmlArray("categories")] 
    [XmlArrayItem("category")] 
    public List<string> Categories { get; set; } 

    [XmlArray("children")] 
    [XmlArrayItem("child")] 
    public List<Child> Children { get; set; } 
} 

public class Child 
{ 
    [XmlElement("description")] 
    public string Description { get; set; } 

    [XmlElement("origin")] 
    public string Origin { get; set; } 

    [XmlAnyElement("other")] 
    public XmlElement Other { get; set; } 
} 

Wenn Sie den String-Wert des Inhalts wollen, können Sie die InnerXml Eigenschaft lesen können. Eine funktionierende Demo finden Sie unter this fiddle.

+0

Ah, das ist der Trick! Vielen Dank! – earthling

0

Wenn Sie das XmlDocument-Objekt verwenden, können Sie mithilfe von Xpath nach verschiedenen Tags suchen. Werfen Sie einen Blick here für etwas genauer, aber mit Ihrem Beispiel:

XmlNode node = root.SelectSingleNode("/child/other"); 
Console.WriteLine(node.InnerXml); 
+0

Ich Deserialisierung Tausende von diesen Objekten mit 'XmlSerializer' und ich denke, es zu ändern, um die Datei iterativ analysieren und erstellen Sie die Objekte würde eine schwere Perf schlagen. – earthling

Verwandte Themen