如何在xml反序列化期间将子节点的内部xml作为字符串返回

时间:2016-08-11 22:41:30

标签: c# xml serialization deserialization

我正在使用反序列化大型xml文档。在大多数情况下,这很好。我并不关心树下面的一些子节点,但它们确实包含我想要捕获的数据以供以后使用,但是我不想完全反序列化它们。我宁愿拿整个节点并将其存储为一个字符串,以后我可以回来。

例如,给出下面的xml文档:

<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>

我想阅读其他节点,并将内部xml存储为字符串(即“&lt; stuff&gt;一些东西要知道&lt; / stuff&gt;&lt; things&gt;我喜欢的东西&lt; /东西&gt;“中)。有意义吗?

在我的item课程中,我在其他属性上尝试了各种 System.Xml.Serialization 属性但没有运气,例如XmlTextXmlElement等等。

我如何做到这一点?这似乎是一项相当普遍的任务。

2 个答案:

答案 0 :(得分:4)

您可以使用XmlAnyElementAttribute反序列化为XmlElement类型的对象来执行此操作。

因此,作为一个例子,这些类可以工作:

[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; }
}

如果您想要内容的字符串值,则可以阅读InnerXml属性。有关正常工作的演示,请参阅this fiddle

答案 1 :(得分:0)

如果您正在使用XmlDocument对象,则可以使用Xpath查询不同的标记。看一下here了解更多细节,但是,使用您的示例:

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