5

我有一些需要解析的 xml(在文件中,但可以是字符串),例如:

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlText);

给定以下 XML:

<foo>
    <cat>...</cat>
    <cat>...</cat>
    <dog>...</dog>
    <cat>...</cat>
    <dog>...</dog>
</foo>

我不确定如何提取所有catdog元素并将它们放入以下输出:-

<foo>
    <cat>...</cat>
    <cat>...</cat>
    ....
</foo>

和狗一样。

提取这些节点并将它们放入单独XMLDocuments的 .

4

3 回答 3

8

使用 Linq to XML,因为它有更好的 API。

var doc = XElement.Parse(
@"<foo>
    <cat>...</cat>
    <cat>...</cat>
    <dog>...</dog>
    <cat>...</cat>
    <dog>...</dog>
</foo>");
doc.Descendants("dog").Remove();

doc现在包含这个:

<foo>
    <cat>...</cat>
    <cat>...</cat>
    <cat>...</cat>
</foo>

编辑:

虽然 Linq to XML 本身提供了一个很好的 API 来处理 XML,但 Linq 的强大功能及其投影功能使您能够按照您认为合适的方式塑造您的数据。

例如,考虑这一点。在这里,后代元素按名称分组并投影到一个新root元素中,然后将其包装到一个XDocument. 请注意,这会创建一个可枚举的XDocument.

var docs= 
    from d in doc.Descendants()
    group d by d.Name into g
    select new XDocument(
        new XElement("root", g)
    );

docs现在包含:

<root>
    <cat>...</cat>
    <cat>...</cat>
    <cat>...</cat>
</root>
---
<root>
    <dog>...</dog>
    <dog>...</dog>
</root> 

哦,顺便说一句。该Descendants方法遍历所有后代元素,Elements如果您只想要直接子元素,请使用。

这是MSDN 上的 Linq to XML 文档

于 2013-10-01T07:00:52.723 回答
2

最简单的方法是使用 XSLT 并将其应用到您身上XMLDocument,这样您就不会修改您的源代码并拥有您需要的尽可能多的输出。

应用变换的代码是

    XslCompiledTransform xslTransform = new XslCompiledTransform();
    StringWriter writer = new StringWriter();          
    xslTransform.Load("cat.xslt");
    xslTransform.Transform(doc.CreateNavigator(),null, writer);
    return writer.ToString();

简单cat.xslt的是

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="foo">
        <xsl:copy>
            <xsl:copy-of select = "cat" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
于 2013-10-01T06:52:58.193 回答
1

由于您使用的是XmlDocument:从同一个文件中加载两次并删除不需要的节点。这是一个向您展示如何操作的链接:Removing nodes from an XmlDocument

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlText);
XmlNode root = doc.DocumentElement;
nodeList = root.SelectNodes("//cat");

foreach (XmlNode node on nodeList)
{
  root.RemoveChild(node);
}
于 2013-10-01T06:49:28.293 回答