मेरे पास निम्नलिखित की तरह 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 में इतने सारे मुख्य तत्व थे। अग्रिम में धन्यवाद।
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");
निम्न कोड स्निपेट सभी डुप्लिकेट को अनदेखा करेगा और अंतिम तत्व का चयन करेगा यदि 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>
आप दो अलग-अलग 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");
संबंधित सवाल
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।