मेरे पास निम्नलिखित की तरह 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 xDoc1 = XDocument.Load(inputFileName);

        var elems = xDoc1.Element("Root").Elements("Main");

        XElement xInstall = elems.LastOrDefault(a => a.Attribute("Name").Value == "Install");
        XElement xUninstall = elems.LastOrDefault(a => a.Attribute("Name").Value == "Uninstall");
        XElement xDiscard = elems.LastOrDefault(a => a.Attribute("Name").Value == "Discard");

        XDocument xdoc2 = new XDocument();

        xdoc2.Add(
            new XElement("Root", new XElement[]
            {
                xInstall,
                xDiscard,
                xUninstall
            })
        );

        xdoc2.Save(ouputFileName);

लेकिन फ़ॉरच लूप में इसी तर्क का उपयोग करते हुए मुझे सही आउटपुट नहीं मिल रहा है। मेरा कोड है,

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>

मेरे कोड में मुझसे क्या गलती है? कृपया इस पर मेरी मदद करें कि फ़ॉरेस्ट लूप का उपयोग करके सही आउटपुट प्राप्त करें। क्योंकि मेरे xml में इतने सारे मुख्य तत्व थे। अग्रिम में धन्यवाद।

1
Gio Frog 30 नवम्बर 2015, 08:31

3 जवाब

सबसे बढ़िया उत्तर

कारण यह है कि आप हर बार "एक्स" नाम के साथ अंतिम तत्व का उत्पादन करते हैं जब भी आपको "एक्स" नाम वाला एक तत्व मिलता है। हालाँकि, आपको याद नहीं है कि आपने इसे आउटपुट किया है या नहीं।

आप इसे List<string> का उपयोग करके और याद कर सकते हैं कि आपने किन वस्तुओं को आउटपुट किया है।

उसी समय, यह परिणाम 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");
0
Yeldar Kurmangaliyev 30 नवम्बर 2015, 06:01

निम्न कोड स्निपेट सभी डुप्लिकेट को अनदेखा करेगा और अंतिम तत्व का चयन करेगा यदि xml में कोई डुप्लिकेट नोड है (विशेषता नाम डुप्लिकेट होने पर)।

XmlDocument xml = new XmlDocument();
string xmlLocationInput = @"C:\Users\jprabadiya\Desktop\Input.xml";
string xmlLocationOutput = @"C:\Users\jprabadiya\Desktop\Output.xml";
xml.Load(xmlLocationInput);
XDocument xDoc1 = XDocument.Load(xmlLocationInput);

var elems = xDoc1.Element("Root").Elements("Main"); 
var nodeList = elems.GroupBy(d => d.Attribute("Name").Value).Select(d => d.Last()).ToList();

XDocument xdoc2 = new XDocument();
xdoc2.Add(new XElement("Root"));
xdoc2.Root.Add(nodeList);

xdoc2.Save(xmlLocationOutput);

उत्पादन:

<?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>
0
Jenish Rabadiya 30 नवम्बर 2015, 05:59

आप दो अलग-अलग 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");
0
Chuck Savage 30 नवम्बर 2015, 05:59