简体   繁体   中英

How to get particular node values when all nodes have same name?

I've xml file like following:

<xml number="1" Maintain="Yes">
<define count="0">
<Root Details="false">
  <Project count="45" Name="Success">
        <Maintainance Id="123" Title="Good">
            <Maintain Id="ABC" />
            <Maintain Id="DEF" />
            <Maintain Id="GHI" />
        </Maintainance>
        <Maintainance Id="456" Title="Better">
            <Maintain Id="JKL" />
            <Maintain Id="MNO" />
            <Maintain Id="PQR" />
        </Maintainance>
        <Maintainance Id="789" Title="Bad">
            <Maintain Id="STU" />
            <Maintain Id="VWX" />
            <Maintain Id="XYZ" />
        </Maintainance> 
  </Project>
</Root> 

From above xml file I need only Maintain node's Id values and print in another xml like following.

<Maintainance Id="123" Fields="ABC,DEF,GHI"/>
<Maintainance Id="456" Fields="JKL,MNO,PQR"/>
<Maintainance Id="789" Fields="STU,VWX,XYZ"/>

I've tried some but can't get correct output. It's better for me by using xmldocument instead of xdocument. Anyone please help me in this. Thanks in advance.

I've used logic like following:

XmlDocument xmlDocument = new XmlDocument();
string Result = string.Empty;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:\input.xml");
foreach (XmlNode MaintainNode in xmlDoc.SelectNodes("/Project/Maintainance"))
{
    if (MaintainNode.SelectSingleNode("Id").Equals("123"))
    {
        Result += Maintain.SelectSingleNode("Maintain").Attributes["Id"].Value;
    }
}
XmlElement MaintainanceElement = xmlDocument.CreateElement("Maintainance");
MaintainanceElement.SetAttribute("Id", 123);
MaintainanceElement.SetAttribute("Fields",string.Join(",", Result.Value.ToArray()));
xmlDocument.AppendChild(MaintainanceElement);
string xmlFile = @"C:\output.xml";
xmlDocument.Save(xmlFile);

Try xml linq. The variable doc will contain modified results.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<xml number=\"1\" Maintain=\"Yes\">" +
                    "<define count=\"0\"/>" +
                    "<Root Details=\"false\">" +
                      "<Project count=\"45\" Name=\"Success\">" +
                            "<Maintainance Id=\"123\" Title=\"Good\">" +
                                "<Maintain Id=\"ABC\" />" +
                                "<Maintain Id=\"DEF\" />" +
                                "<Maintain Id=\"GHI\" />" +
                            "</Maintainance>" +
                            "<Maintainance Id=\"456\" Title=\"Better\">" +
                                "<Maintain Id=\"JKL\" />" +
                                "<Maintain Id=\"MNO\" />" +
                                "<Maintain Id=\"PQR\" />" +
                            "</Maintainance>" +
                            "<Maintainance Id=\"789\" Title=\"Bad\">" +
                                "<Maintain Id=\"STU\" />" +
                                "<Maintain Id=\"VWX\" />" +
                                "<Maintain Id=\"XYZ\" />" +
                            "</Maintainance>" +
                      "</Project>" +
                    "</Root>" +
                   "</xml>";

            XDocument doc = XDocument.Parse(xml);

            List<XElement> maintainances = doc.Descendants("Maintainance").ToList();
            foreach (XElement maintainance in maintainances)
            {
                string[] ids = maintainance.Elements("Maintain").Select(x => x.Attribute("Id").Value).ToArray();
                maintainance.ReplaceWith(new XElement("Maintainance", new object[] {
                    maintainance.Attribute("Id"),
                    new XAttribute("Fields", string.Join(",", ids))
                }));
            }
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM