如何读取一些XML然后拆分.NET中的各种节点/元素?

Pur*_*ome 5 .net c# xml

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

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlText);
Run Code Online (Sandbox Code Playgroud)

给出以下XML:

<foo>
    <cat>...</cat>
    <cat>...</cat>
    <dog>...</dog>
    <cat>...</cat>
    <dog>...</dog>
</foo>
Run Code Online (Sandbox Code Playgroud)

我不知道我怎么能提取所有catdog元素,并把它们放到下面的输出: -

<foo>
    <cat>...</cat>
    <cat>...</cat>
    ....
</foo>
Run Code Online (Sandbox Code Playgroud)

和狗一样

有什么绝招来提取这些节点,并把它们放在不同XMLDocuments.

Mik*_*erg 8

使用Linq到XML,因为它有一个更好的API.

var doc = XElement.Parse(
@"<foo>
    <cat>...</cat>
    <cat>...</cat>
    <dog>...</dog>
    <cat>...</cat>
    <dog>...</dog>
</foo>");
doc.Descendants("dog").Remove();
Run Code Online (Sandbox Code Playgroud)

doc 现在包含这个:

<foo>
    <cat>...</cat>
    <cat>...</cat>
    <cat>...</cat>
</foo>
Run Code Online (Sandbox Code Playgroud)

编辑:

虽然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)
    );
Run Code Online (Sandbox Code Playgroud)

docs 现在包含:

<root>
    <cat>...</cat>
    <cat>...</cat>
    <cat>...</cat>
</root>
---
<root>
    <dog>...</dog>
    <dog>...</dog>
</root> 
Run Code Online (Sandbox Code Playgroud)

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

以下是MSDN上Linq to XML文档


mei*_*lke 1

由于您正在使用XmlDocument:从同一文件加载两次并删除不需要的节点。以下链接向您展示了如何操作:从 XmlDocument 中删除节点

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

foreach (XmlNode node on nodeList)
{
  root.RemoveChild(node);
}
Run Code Online (Sandbox Code Playgroud)