2011-09-19 20 views
10

के सभी नोड्स प्राप्त करना क्या कोई आसान तरीका है, किसी XML दस्तावेज़ से सभी नोड्स प्राप्त करने के लिए? मुझे यह देखने के लिए कि क्या उनके पास कुछ विशेष गुण हैं, मुझे प्रत्येक एकल नोड, बाल नोड और अन्य की आवश्यकता है।सी #: एक्सएमएल दस्तावेज़

या क्या मुझे दस्तावेज़ के माध्यम से गुजरना होगा, बालिकाओं के लिए पूछना होगा?

+0

आप कुछ विशेषताओं के लिए जांच करने की जरूरत है, तो आप _every node_ (पाठ नोड, दस्तावेज़ नोड, टिप्पणी नोड) के माध्यम से जाने की जरूरत नहीं है। बस प्रत्येक तत्व नोड, या प्रत्येक विशेषता नोड (यानी LINQ या XSLT के साथ) के माध्यम से जाओ। तत्व नोड्स गुणों के साथ एकमात्र नोड प्रकार हैं। – Abel

+0

यह दस्तावेज़ कितना बड़ा है? क्या यह अनुकूलन योग्य होगा? –

+0

लिंक देखें [http://forums.asp.net/t/1285409.aspx/1](http://forums.asp.net/t/1285409.aspx/1) [http: //www.developerfusion .com/article/4078/पढ़ने-भंडारण और बदलने-एक्सएमएल-डेटा-इन-नेट/5 /] (http://www.developerfusion.com/article/4078/reading-storing-and-transforming-xml -डेटा-इन-नेट/5 /) [http://weblogs.asp.net/karan/archive/2010/04/29/parse-an-xml-file.aspx ](http://weblogs.asp। नेट/करेन/संग्रह/2010/04/2 9/parse-an-xml-file.aspx) – Prasanth

उत्तर

20

LINQ में यह XML के लिए बेहद आसान है:

XDocument doc = XDocument.Load("test.xml"); // Or whatever 
var allElements = doc.Descendants(); 

उदाहरण के लिए, किसी विशेष विशेषता के साथ सभी तत्वों को खोजने के लिए:

var matchingElements = doc.Descendants() 
          .Where(x => x.Attribute("foo") != null); 

यह मानते हुए कि आप सभी तत्व चाहते थे। यदि आप सभी नोड (टेक्स्ट नोड्स इत्यादि सहित, लेकिन अलग-अलग नोड्स के रूप में विशेषताओं सहित) चाहते हैं तो आप DescendantNodes() का उपयोग करेंगे।

संपादित करें: LINQ से XML में नेमस्पेस अच्छे हैं। आप उपयोग करेंगे:

var matchingElements = doc.Descendants() 
          .Where(x => x.Attribute(XNamespace.Xmlns + "aml") != null); 

या एक अलग नाम स्थान के लिए:

XNamespace ns = "http://some.namespace.uri"; 

var matchingElements = doc.Descendants() 
                         .Where(x => x.Attribute(ns + "foo") != null); 
+0

@ जेफ: क्या आप एक विशेषता प्राप्त करने के लिए विधि कॉल के बजाय इंडेक्सर का उपयोग करने के मामले में हैं? यदि हां, तो तय करें। यदि नहीं, तो मैं उलझन में हूं ... –

+0

हाँ, यही मेरा मतलब था। :) –

+0

उत्कृष्ट। Abit असंबंधित है, लेकिन मैं विशेषताओं के लिए कैसे जांचूँगा, जिनके नाम पर नामस्थान है? पसंद: xmlns: aml? यह कहता है कि मेरे पास नहीं है: मेरे विशेषता नाम में है। – Nicolai

1

एक्सएमएल से LINQ देखें। यही वह है जो आपको चाहिए।

http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx

उदाहरण के लिए आप SelectMany एक्सटेंशन का उपयोग कर सकते हैं।

लेकिन यदि आप मूल्यों की जांच करना चाहते हैं तो आप where -statements बनाने के लिए केवल LINQ का उपयोग कर सकते हैं।

6

यहाँ देखें: Iterating through all nodes in XML file

शीघ्र ही:

string xml = @" 
    <parent> 
     <child> 
     <nested /> 
     </child> 
     <child> 
     <other> 
     </other> 
     </child> 
    </parent> 
    "; 

    XmlReader rdr = XmlReader.Create(new System.IO.StringReader(xml)); 
    while (rdr.Read()) 
    { 
    if (rdr.NodeType == XmlNodeType.Element) 
    { 
     Console.WriteLine(rdr.LocalName); 
    } 
    } 
+1

यह विधि आमतौर पर XDocument और अन्य DOM जैसी विधियों की तुलना में बहुत तेज है। – Abel

0
protected void Page_Load(object sender, EventArgs e) 
    { 

      XmlDocument document = new XmlDocument(); 

      string xmlStr; 
      using (var wc = new WebClient()) 
      { 
       xmlStr = wc.DownloadString("test.xml"); 
      } 

      var xmlDoc = new XmlDocument(); 

      xmlDoc.LoadXml(xmlStr); 

      XmlNode xnod = xmlDoc.DocumentElement; 

      AddWithChildren(xnod, 1); 
} 
+0

स्पष्टीकरण के बिना कोड डंप शायद ही कभी सहायक हैं। कृपया अपने उत्तर में कुछ संदर्भ जोड़ने पर विचार करें। – Chris

0
public void AddWithChildren(XmlNode xnod, Int32 intLevel) //,XmlDocument xmlDoc 
    { 
     List<IEnumerable> item = new List<IEnumerable>(); 
     XmlNode xnodWorking; 
     String strIndent = new string('-', 2 * intLevel); 
     String strIndent1 = new string('@', 2 * intLevel); 
     if (xnod.NodeType == XmlNodeType.Element) 
     { 
      item.Add(new ListXML(strIndent + xnod.Name, strIndent + xnod.Name, "")); 
      XmlNamedNodeMap mapAttributes = xnod.Attributes; 
      foreach (XmlNode xnodAttribute in mapAttributes) 
      { 
       item.Add(new ListXML(strIndent1 + xnodAttribute.Name, strIndent1 + xnodAttribute.Name, "")); 
      } 
      if (xnod.HasChildNodes) 
      { 
       xnodWorking = xnod.FirstChild; 
       while (xnodWorking != null) 
       { 
        AddWithChildren(xnodWorking, intLevel + 1); 
        xnodWorking = xnodWorking.NextSibling; 
       } 
      } 
     } 
    } 
3

मेरी राय सरल समाधान XPath का उपयोग कर किया जाता है। इसके अलावा इस अगर आप नेट 2 काम करता है:

var testDoc = new XmlDocument(); 
       testDoc.LoadXml(str); 
       var tmp = testDoc.SelectNodes("//*"); // match every element 
संबंधित मुद्दे