2009-11-01 12 views
5

मेरे पास कई एक्सएमएल फाइलें हैं जिन्हें मैं विशेषताओं को पढ़ना चाहता हूं। मेरा मुख्य उद्देश्य समृद्ध टेक्स्ट बॉक्स पर हाइलाइटिंग सिंटैक्स लागू करना है।सी # में एक्सएमएल विशेषताओं को कैसे पढ़ा जाए?

उदाहरण के लिए मेरे एक्सएमएल दस्तावेज़ों में से एक में मेरे पास है: <Keyword name="using">[..] सभी फाइलों में एक ही तत्व है: Keyword

तो, मैं name विशेषता के लिए मूल्य कैसे प्राप्त कर सकता हूं और उन्हें प्रत्येक XML फ़ाइल के लिए तारों के संग्रह में डाल सकता हूं।

मैं उपयोग कर रहा हूँ विजुअल C# 2008

उत्तर

4

अन्य उत्तर काम करेगा - लेकिन वाक्य रचना हाइलाइटिंग thingy और कई xml फ़ाइलें आप कहते हैं कि तुम मुझे लगता है कि आपको कुछ तेजी से, क्यों नहीं की जरूरत है बनाता है एक दुबला और मतलब XmlReader का उपयोग करें?

private string[] getNames(string fileName) 
{ 

    XmlReader xmlReader = XmlReader.Create(fileName); 
    List<string> names = new List<string>(); 

    while (xmlReader.Read()) 
    { 
    //keep reading until we see your element 
    if (xmlReader.Name.Equals("Keyword") && (xmlReader.NodeType == XmlNodeType.Element)) 
    { 
    // get attribute from the Xml element here 
    string name = xmlReader.GetAttribute("name"); 
    // --> now **add to collection** - or whatever 
    names.Add(name); 
    } 
    } 

    return names.ToArray(); 
} 

एक और अच्छा विकल्प XPathNavigator वर्ग होगा - जो xmlDoc की तुलना में तेजी है और आप XPath का उपयोग कर सकते हैं।

साथ ही मैं इस दृष्टिकोण के साथ केवल आईएफएफ के साथ जाने का सुझाव दूंगा, जब आप सीधे विकल्पों के साथ प्रयास करें, तो आप प्रदर्शन से खुश नहीं हैं।

+0

यही वही है जो मुझे चाहिए लेकिन ... मैं स्ट्रिंग सरणी के रूप में "जो कुछ भी" डालूं? –

+0

सिंटैक्स हाइलाइटिंग के लिए, मुझे बहुत संदेह है कि वह फ़ाइल को और अधिक पढ़ना चाहेंगे। स्पष्ट समाधान इसे * एक बार * पढ़ना है, जिसका अर्थ है कि गति पठनीयता से बहुत कम महत्वपूर्ण है। LINQ से XML का उपयोग करना यहां स्पष्ट समाधान है, आईएमओ। –

+0

@ जोनस्केट मैं सहमत हूं - वास्तव में मैंने इस दृष्टिकोण पर विचार करने का सुझाव दिया है यदि प्रदर्शन एक मुद्दा साबित होता है (उदाहरण के लिए - फ़ाइल को एक बार पढ़ना - यह मामला हो सकता है कि इसे बड़ी संख्या में बड़ी फ़ाइलों पर किया जाना चाहिए और स्टार्टअप/लोड प्रदर्शन को काफी प्रभावित किया जा सकता है) – JohnIdol

3

आप XPath का उपयोग सभी तत्वों को प्राप्त करने के लिए कर सकता है, सब नाम पर मूल्यों को प्राप्त करने के लिए तो एक LINQ क्वेरी आप पा atttributes:

XDocument doc = yourDocument; 
var nodes = from element in doc.XPathSelectElements("//Keyword") 
      let att = element.Attribute("name") 
      where att != null 
      select att.Value; 
string[] names = nodes.ToArray(); 

// कीवर्ड XPath अभिव्यक्ति का मतलब है, कीवर्ड "" दस्तावेज़ नाम के सभी तत्वों "

संपादित:। बस देखा है कि आप केवल कीवर्ड नामित तत्वों चाहते अपडेट किया गया कोड नमूना

।।
+0

मैं अपने XML दस्तावेज़ का मूल्य XDocument कैसे दे सकता हूं? विजुअल सी # में, समाधान एक्सप्लोरर पर, मेरे पास एपीआई नामक एक फ़ोल्डर है, अंदर सभी एक्सएमएल दस्तावेज हैं, उदाहरण के लिए: batch.xml। क्या मैं इसे स्ट्रिंग के रूप में तुरंत चालू करता हूं या क्या? –

+0

@Mohit: 'XDocument doc = XDocument.Load (@" API \ batch.xml ");' –

+0

चाल चलाना चाहिए "मुझे मिला" एंटीटीनाम को पार्स करते समय एक त्रुटि आई। लाइन 1120, स्थिति 27. " यह लाइन 1120 है: स्थिति 27 ई और आर –

0

आप LINQ से XML का उपयोग कर सकते हैं।

उदाहरण:

var xmlFile = XDocument.Load(someFile); 
var query = from item in xmlFile.Descendants("childobject") 
      where !String.IsNullOrEmpty(item.Attribute("using") 
      select new 
      { 
       AttributeValue = item.Attribute("using").Value 
      }; 
0

आप संभावना XPath का उपयोग करना चाहेंगे। //Keyword/@name आपको सभी कीवर्ड नाम प्राप्त करना चाहिए।

यहां एक अच्छी शुरूआत है: .Net and XML XPath Queries

3

दूसरों की तरह, मैं LINQ से XML का उपयोग करने का सुझाव दूंगा - लेकिन मुझे नहीं लगता कि XPath का उपयोग करने की बहुत आवश्यकता है।

static IEnumerable<string> GetKeywordNames(string file) 
{ 
    return XDocument.Load(file) 
        .Descendants("Keyword") 
        .Attributes("name") 
        .Select(attr => attr.Value); 
} 

अच्छा और कथात्मक :)

ध्यान दें कि अगर आप एक बार से अधिक परिणाम का उपयोग करना चाहते करने जा रहे हैं, तो आप कॉल करना चाहिए: यह एक फ़ाइल के भीतर सभी खोजशब्द नाम वापस जाने के लिए एक सरल विधि है ToList() या ToArray(), अन्यथा यह हर बार फ़ाइल को फिर से लोड करेगा। बेशक आप विधि कॉल की श्रृंखला के अंत में प्रासंगिक कॉल को जोड़कर List<string>or string[] वापस करने के लिए विधि को बदल सकते हैं, उदा।

static List<string> GetKeywordNames(string file) 
{ 
    return XDocument.Load(file) 
        .Descendants("Keyword") 
        .Attributes("name") 
        .Select(attr => attr.Value) 
        .ToList(); 
} 

भी ध्यान रखें कि इस सिर्फ आप नाम देता है - मैं तुम्हें तत्वों के अन्य विवरण, जिस स्थिति में आप शायद कुछ अलग चाहते हैं चाहते करने की उम्मीद है। यदि यह पता चला है कि आपको और आवश्यकता है, तो कृपया हमें बताएं।

0
**<Countries> 
    <Country name ="ANDORRA"> 
    <state>Andorra (general)</state> 
    <state>Andorra</state> 
    </Country> 
    <Country name ="United Arab Emirates"> 
    <state>Abu Z¸aby</state> 
    <state>Umm al Qaywayn</state> 
    </Country>** 



public void datass(string file) 
    { 

      string file = HttpContext.Current.Server.MapPath("~/App_Data/CS.xml"); 
       XmlDocument doc = new XmlDocument(); 
       if (System.IO.File.Exists(file)) 
       { 
        //Load the XML File 
        doc.Load(file); 

       } 


       //Get the root element 
       XmlElement root = doc.DocumentElement; 
       XmlNodeList subroot = root.SelectNodes("Country"); 

       for (int i = 0; i < subroot.Count; i++)  
       { 

        XmlNode elem = subroot.Item(i); 
        string attrVal = elem.Attributes["name"].Value; 
        Response.Write(attrVal); 
        XmlNodeList sub = elem.SelectNodes("state"); 
        for (int j = 0; j < sub.Count; j++) 
        { 
         XmlNode elem1 = sub.Item(j); 
         Response.Write(elem1.InnerText); 

        } 
       } 

    } 
संबंधित मुद्दे