我需要解析一些xml(在一个文件中,但可以是一个字符串),例如:
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlText);
给出以下XML:
<foo>
<cat>...</cat>
<cat>...</cat>
<dog>...</dog>
<cat>...</cat>
<dog>...</dog>
</foo>
我不确定如何提取所有cat
和dog
元素并将它们放入以下输出中: -
<foo>
<cat>...</cat>
<cat>...</cat>
....
</foo>
和狗一样。
提取这些节点并将它们放入单独的XMLDocuments
。
答案 0 :(得分:8)
使用Linq到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
。
答案 1 :(得分: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>
答案 2 :(得分: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);
}