Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除xml中重复的节点详细信息?_C#_Xml - Fatal编程技术网

C# 如何删除xml中重复的节点详细信息?

C# 如何删除xml中重复的节点详细信息?,c#,xml,C#,Xml,我有如下xml文件 <Root> <Main Name="Install"> <Details>Success</Details> <Maintain>Install period</Maintain> </Main> <Main Name="Uninstall"> <Details>failure</D

我有如下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>
但在foreach循环中使用相同的逻辑时,我无法获得正确的输出。我的密码是

XmlDocument xml = new XmlDocument();
string xmlLocation = @"C:\Input.xml";
xml.Load(xmlLocation);
XmlNodeList MainNameList = xml.SelectNodes("/Root/Main");

XDocument xDoc1 = XDocument.Load(@"C:\Input.xml");

var elems = xDoc1.Element("Root").Elements("Main");
XDocument xdoc2 = new XDocument();
xdoc2.Add(new XElement("Root"));
foreach (XmlNode MainNode in MainNameList)
{
    string mainName = MainNode.Attributes[0].Value;
    XElement MainNode = elems.LastOrDefault(a => a.Attribute("Name").Value == mainName);


    xdoc2.Root.Add(new XElement("Root", new XElement(MainNode)));

}

xdoc2.Save(@"C:\Output.xml");
结果如下:

<Root>
  <Main Name="Install">
    <Details>Success</Details>
    <Maintain>Naveen</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>Success</Details>
    <Maintain>Naveen</Maintain>
  </Main>
</Root>
<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>

成功
纳文
失败
卸载期
失败
废弃期
成功
纳文
但我需要如下输出:

<Root>
  <Main Name="Install">
    <Details>Success</Details>
    <Maintain>Naveen</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>Success</Details>
    <Maintain>Naveen</Maintain>
  </Main>
</Root>
<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>

失败
卸载期
失败
废弃期
多恩
得到输出

我的密码有什么错误?请帮助我使用foreach循环获得正确的输出。因为我的xml中有很多主要元素。提前感谢。

如果xml中有任何重复的节点(属性名重复),下面的代码片段将忽略所有重复项并选择最后一个元素

输出:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Main Name="Install">
    <Details>Done</Details>
    <Maintain>Got Output</Maintain>
  </Main>
  <Main Name="Uninstall">
    <Details>failure</Details>
    <Maintain>uninstall period</Maintain>
  </Main>
  <Main Name="Discard">
    <Details>failure</Details>
    <Maintain>discard period</Maintain>
  </Main>
</Root>

多恩
得到输出
失败
卸载期
失败
废弃期

如果xml中存在任何重复节点(属性名称重复),则以下代码段将忽略所有重复的元素,并选择最后一个元素

输出:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Main Name="Install">
    <Details>Done</Details>
    <Maintain>Got Output</Maintain>
  </Main>
  <Main Name="Uninstall">
    <Details>failure</Details>
    <Maintain>uninstall period</Maintain>
  </Main>
  <Main Name="Discard">
    <Details>failure</Details>
    <Maintain>discard period</Maintain>
  </Main>
</Root>

多恩
得到输出
失败
卸载期
失败
废弃期

如果您使用两个不同的XML库,我将把它简化为Linq2XML

XDocument xDoc1 = XDocument.Load(@"C:\Input.xml");
var elems = xDoc1.Descendants("Main");

// Get all the main names in the input file (1 of each)
string[] names = elems
    .Select(main => main.Attribute("Name").Value)
    .Distinct()
    .ToArray();

XDocument xdoc2 = new XDocument();
XElement root;
xdoc2.Add(root = new XElement("Root"));
foreach (string name in names)
{
    XElement node = elems
        .LastOrDefault(a => a.Attribute("Name").Value == name);
    root.Add(new XElement(node));
}

xdoc2.Save(@"C:\Output.xml");

您正在使用两个不同的XML库,我将把它简化为Linq2XML

XDocument xDoc1 = XDocument.Load(@"C:\Input.xml");
var elems = xDoc1.Descendants("Main");

// Get all the main names in the input file (1 of each)
string[] names = elems
    .Select(main => main.Attribute("Name").Value)
    .Distinct()
    .ToArray();

XDocument xdoc2 = new XDocument();
XElement root;
xdoc2.Add(root = new XElement("Root"));
foreach (string name in names)
{
    XElement node = elems
        .LastOrDefault(a => a.Attribute("Name").Value == name);
    root.Add(new XElement(node));
}

xdoc2.Save(@"C:\Output.xml");

原因是每次找到名为“X”的元素时,您只需输出最后一个名为“X”的元素。然而,你不记得你是否已经输出了它

您只需利用
列表
并记住您已输出的项目即可

同时,通过对LINQ进行utulizing、对项目进行分组并从每组中提取最后一个项目,可以轻松实现此结果:

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");

原因是每次找到名为“X”的元素时,您只需输出最后一个名为“X”的元素。然而,你不记得你是否已经输出了它

您只需利用
列表
并记住您已输出的项目即可

同时,通过对LINQ进行utulizing、对项目进行分组并从每组中提取最后一个项目,可以轻松实现此结果:

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");


首先,由于行
XElement MainNode=elems.LastOrDefault(a=>a.Attribute(“Name”).Value==mainName),代码无法编译因为您的foreach也声明了同名的变量。输出顺序对您重要吗?如果是“安装”-“放弃”-“卸载”,是否可以?输出顺序不重要。“安装”-“放弃”-“卸载”对我来说是可以的@YeldarKurmangaliyevFirst所有代码都无法编译,因为行
XElement MainNode=elems.LastOrDefault(a=>a.Attribute(“Name”).Value==mainName)因为您的foreach也声明了同名的变量。输出顺序对您重要吗?如果是“安装”-“放弃”-“卸载”,是否可以?输出顺序不重要。“安装”-“放弃”-“卸载”对我来说是可以的@YeldarKurmangaliyevI正在考虑一个GroupBy,但他希望得到foreach循环的帮助。不过很好。我能通过使用xmldocument(使用system.xml)获得同样的输出吗?是否有任何可能的XML文档@Yeldar@GioFrog不支持,
XmlDocument
不支持LINQ。为什么要使用
XmlDocument
?使用
XDocument
,它更好更方便。是的,我明白。但我想知道这个操作在xmldocument中也可用。这就是为什么有人问我。它能在XML文档中工作吗?如果是,怎么做?@YeldarKurmangaliyevI正在考虑一个GroupBy,但他希望在他的foreach循环中得到帮助。不过很好。我能通过使用xmldocument(使用system.xml)获得同样的输出吗?是否有任何可能的XML文档@Yeldar@GioFrog不支持,
XmlDocument
不支持LINQ。为什么要使用
XmlDocument
?使用
XDocument
,它更好更方便。是的,我明白。但我想知道这个操作在xmldocument中也可用。这就是为什么有人问我。它能在XML文档中工作吗?如果是,怎么做?@YeldarKurmangaliyevAm我能通过使用xmldocument(使用system.xml)获得同样的输出吗?是否有任何可能的XML文档@JenishNo我的问题是,不使用xdocument,使用xmldocument有什么选择吗@Jenish我能通过使用xmldocument(使用system.xml)获得同样的输出吗?是否有任何可能的XML文档@JenishNo我的问题是,不使用xdocument,使用xmldocument有什么选择吗@Jenish我能通过使用xmldocument(使用system.xml)获得同样的输出吗?是否有任何可能的XML文档@Chuck@GioFrog可能,我只是不知道旧的
XmlDocument
编码风格。好的,朋友。谢谢你的回复@通过使用xmldocument(使用system.xml),我能得到同样的输出吗?是否有任何可能的XML文档@Chuck@GioFrog可能,我只是不知道旧的
XmlDocument
编码风格。好的,朋友。谢谢你的回复@扔出