एक XML (एक स्ट्रिंग से) पढ़ें और कुछ फ़ील्ड प्राप्त करें - XML ​​पढ़ने में समस्याएं


83

मेरे पास यह XML है (C # स्ट्रिंग में संग्रहीत है myXML)

<?xml version="1.0" encoding="utf-16"?>
<myDataz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <listS>
    <sog>
      <field1>123</field1>
      <field2>a</field2>
      <field3>b</field3>
    </sog>
    <sog>
      <field1>456</field1>
      <field2>c</field2>
      <field3>d</field3>
    </sog>
  </listS>
</myDataz>

और मैं सभी <sog>तत्वों को ब्राउज़ करना चाहूंगा । उनमें से प्रत्येक के लिए, मैं बच्चे को प्रिंट करना चाहता हूं <field1>

तो यह मेरा कोड है:

XmlDocument xmlDoc = new XmlDocument();
string myXML = "<?xml version=\"1.0\" encoding=\"utf-16\"?><myDataz xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><listS><sog><field1>123</field1><field2>a</field2><field3>b</field3></sog><sog><field1>456</field1><field2>c</field2><field3>d</field3></sog></listS></myDataz>"
xmlDoc.Load(myXML);
XmlNodeList parentNode = xmlDoc.GetElementsByTagName("listS");
foreach (XmlNode childrenNode in parentNode)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
}

लेकिन लगता है कि मैं XML के रूप में एक स्ट्रिंग नहीं पढ़ सकता हूं? मुझे मिलाSystem.ArgumentException


2
अपवाद क्या कहता है ?
SLAKs

क्या आप .NET 4.0 में XDocument का उपयोग कर सकते हैं?
जॉन

मैं .NET 3.5 पर हूँ! मैंने अपवाद लिखा!
अंक

1
अपवाद संदेश क्या है ?
एसएलएक्स

XLINQ पूरी तरह से .Net 3.5 पर समर्थित है और उपयोग करने के लिए बहुत आसान है।
SLACs

जवाबों:


109

आपको लोडएक्सएमएल विधि का उपयोग करना चाहिए, लोड नहीं:

xmlDoc.LoadXml(myXML); 

लोड विधि एक फ़ाइल से xml और एक स्ट्रिंग से LoadXml लोड करने की कोशिश कर रही है। आप XPath का उपयोग भी कर सकते हैं:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);

string xpath = "myDataz/listS/sog";
var nodes = xmlDoc.SelectNodes(xpath);

foreach (XmlNode childrenNode in nodes)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
} 

बहुत आसान है। अंत में मैं एपीआई के साथ काम करना शुरू कर सकता हूं :)।
C4d

7
इसके बजाय SelectSingleNode("//field1").Valueयह होना चाहिए SelectSingleNode("//field1").InnerTextया SelectSingleNode("//field1").InnerXml, क्योंकि मान शून्य होगा, क्योंकि यह एक विशेषता नहीं है, लेकिन मूल्य टैग के बीच है।
मथियास कॉनराड्ट

3
@MathiasConradt में जोड़ने के लिए, यह तब होना चाहिए SelectSingleNode("field1").InnerTextजब आप हमेशा field1myDataz / listS / sog की पहली घटना को नहीं पढ़ना चाहते हैं।
मैथ्यू एम।

19

Linq-XML का उपयोग करें,

XDocument doc = XDocument.Load(file);

var result = from ele in doc.Descendants("sog")
              select new
              {
                 field1 = (string)ele.Element("field1")
              };
 foreach (var t in result)
  {
      HttpContext.Current.Response.Write(t.field1);
  }

या: <sog>टैग की नोड सूची प्राप्त करें ।

 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.Load(myXML);
 XmlNodeList parentNode = xmlDoc.GetElementsByTagName("sog");
 foreach (XmlNode childrenNode in parentNode)
  {
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("field1").InnerText);
   }

11

अन्य उत्तर कई साल पुराने हैं (और विंडोज फोन 8.1 के लिए काम नहीं करते हैं) तो मुझे लगा कि मैं दूसरे विकल्प में छोड़ दूंगा। मैंने विंडोज फोन ऐप के लिए आरएसएस की प्रतिक्रिया को पार्स करने के लिए इसका उपयोग किया:

XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(xml_string);

3

या XmlSerializer वर्ग का उपयोग करें।

XmlSerializer xs = new XmlSerializer(objectType);
obj = xs.Deserialize(new StringReader(yourXmlString));

2

मैंने इस उद्देश्य के लिए System.Xml.Linq.XElement का उपयोग किया। Xml के पहले चाइल्ड नोड (रूट नोड नहीं) के मूल्य को पढ़ने के लिए बस नीचे दिए गए कोड की जांच करें।

        string textXml = "<xmlroot><firstchild>value of first child</firstchild>........</xmlroot>";
        XElement xmlroot = XElement.Parse(textXml);
        string firstNodeContent = ((System.Xml.Linq.XElement)(xmlroot.FirstNode)).Value;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.