选择XML的子集

时间:2013-10-04 12:14:59

标签: c# xml

我知道这是一个非常基本的问题,但我是XML的新手,虽然看起来很简单,但我无法在任何地方找到简单的答案。我有一个XML文档,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root version="1">
<targets>
    <target type="email">
        <property name="to">b1q23@email.com</property>
    </target>
    <target type="fob"/>
</targets>
<observation uniqueID="00A60D" deviceID="308610ea23">
    <field name="field1">test1</field>
    <field name="field2">test2</field>
</observation>

我尝试选择该xml的子集,或删除节点,以便将其缩减为:

    <observation uniqueID="00A60D" deviceID="308610ea23">
    <field name="attachments">
        <string>1910.jpg</string>
    </field>
    <field name="field1">test1</field>
    <field name="field2">test2</field>
</observation>

这样我就可以将它反序列化为一个对象。任何帮助是极大的赞赏。

3 个答案:

答案 0 :(得分:1)

您可以使用XPath:

string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
        "<root version=\"1\">" +
        "<targets>" +
            "<target type=\"email\">" +
                "<property name=\"to\">b1q23@email.com</property>" +
            "</target>" +
            "<target type=\"fob\"/>" +
        "</targets>" +
        "<observation uniqueID=\"00A60D\" deviceID=\"308610ea23\">" +
            "<field name=\"field1\">test1</field>" +
            "<field name=\"field2\">test2</field>" +
        "</observation>" +
        "</root>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

XmlElement root = doc.DocumentElement;
var observationNode = root.SelectSingleNode("/root/observation");

var observationXml = observationNode.OuterXml;

答案 1 :(得分:1)

这是XML到LINQ版本:

dynamic root= XElement.Load(dataStream).Descendants("root")
                        .Select(element => element.Value).ToArray();

这将从文档中提供所有root元素。您可以访问root

答案 2 :(得分:0)

XElement root = XElement.Parse("<root version ..." // etc. to parse a string. 
// Use XElement.Load to load a file.

var observations = root.Elements("observation");

它假定一个根(根据定义)和可能多个observation元素。