如何使用 xmldocument 获取最新的节点详细信息?
How to get latest node details by using xmldocument?
我有 xml 个文件,如下所示。
<Root>
<Main Name="Install">
<Details>Success</Details>
<Maintain>Install period</Maintain>
</Main>
<Main Name="Uninstall">
<Details>failure</Details>
<Maintain>uninstall period</Maintain>
</Main>
<Main Name="Discard">
<Details>failure</Details>
<Maintain>discard period</Maintain>
</Main>
<Main Name="Install">
<Details>Done</Details>
<Maintain>Got Output</Maintain>
</Main>
</Root>
我只需要在 xml 中打印最新的最新更新。
我使用了以下 xdocument(使用 system.xml.Linq)代码并找到了输出。
XDocument xDoc1 = XDocument.Load(@"C:\Input.xml");
var elemsNew = xDoc1.Element("Root").Elements("Main")
.GroupBy(x => x.Attribute("Name").Value)
.Select(g => g.Last())
.ToArray();
XDocument xDoc2 = new XDocument(new XElement("Root", elemsNew));
xDoc2.Save(@"C:\Output.xml");
输出如下:
<Root>
<Main Name="Uninstall">
<Details>failure</Details>
<Maintain>uninstall period</Maintain>
</Main>
<Main Name="Discard">
<Details>failure</Details>
<Maintain>discard period</Maintain>
</Main>
<Main Name="Install">
<Details>Done</Details>
<Maintain>Got Output</Maintain>
</Main>
</Root>
但不是使用 xdocument 是否有通过 xmldocument(使用 system.xml)获取此输出的任何选项?我只需要 xml 文档的输出。
您可以手动完成。只需从头到尾遍历 Main
元素,删除任何已满足 Name
属性的项目。
var document = new XmlDocument();
document.LoadXml(xmlString);
Dictionary<string, bool> used = new Dictionary<string, bool>();
var allNodes = document.SelectNodes("Root/Main");
for (int i = allNodes.Count - 1; i >= 0; i--)
{
var name = ((XmlElement)allNodes[i]).GetAttribute("Name");
if (used.ContainsKey(name))
{
allNodes[i].ParentNode.RemoveChild(allNodes[i]);
}
else
{
used.Add(name, true);
}
}
Console.WriteLine(document.OuterXml);
这是工作 IDEOne demo。
然而,正如我在评论中提到的,使用 XDocument
是一个非常好的主意,因为它更方便,而且很现代。
我有 xml 个文件,如下所示。
<Root>
<Main Name="Install">
<Details>Success</Details>
<Maintain>Install period</Maintain>
</Main>
<Main Name="Uninstall">
<Details>failure</Details>
<Maintain>uninstall period</Maintain>
</Main>
<Main Name="Discard">
<Details>failure</Details>
<Maintain>discard period</Maintain>
</Main>
<Main Name="Install">
<Details>Done</Details>
<Maintain>Got Output</Maintain>
</Main>
</Root>
我只需要在 xml 中打印最新的最新更新。
我使用了以下 xdocument(使用 system.xml.Linq)代码并找到了输出。
XDocument xDoc1 = XDocument.Load(@"C:\Input.xml");
var elemsNew = xDoc1.Element("Root").Elements("Main")
.GroupBy(x => x.Attribute("Name").Value)
.Select(g => g.Last())
.ToArray();
XDocument xDoc2 = new XDocument(new XElement("Root", elemsNew));
xDoc2.Save(@"C:\Output.xml");
输出如下:
<Root>
<Main Name="Uninstall">
<Details>failure</Details>
<Maintain>uninstall period</Maintain>
</Main>
<Main Name="Discard">
<Details>failure</Details>
<Maintain>discard period</Maintain>
</Main>
<Main Name="Install">
<Details>Done</Details>
<Maintain>Got Output</Maintain>
</Main>
</Root>
但不是使用 xdocument 是否有通过 xmldocument(使用 system.xml)获取此输出的任何选项?我只需要 xml 文档的输出。
您可以手动完成。只需从头到尾遍历 Main
元素,删除任何已满足 Name
属性的项目。
var document = new XmlDocument();
document.LoadXml(xmlString);
Dictionary<string, bool> used = new Dictionary<string, bool>();
var allNodes = document.SelectNodes("Root/Main");
for (int i = allNodes.Count - 1; i >= 0; i--)
{
var name = ((XmlElement)allNodes[i]).GetAttribute("Name");
if (used.ContainsKey(name))
{
allNodes[i].ParentNode.RemoveChild(allNodes[i]);
}
else
{
used.Add(name, true);
}
}
Console.WriteLine(document.OuterXml);
这是工作 IDEOne demo。
然而,正如我在评论中提到的,使用 XDocument
是一个非常好的主意,因为它更方便,而且很现代。