2010-04-13 14 views
9

ठीक है, यादृच्छिक प्रश्न का थोड़ा सा उपयोग करते समय एक तत्व मौजूद है, लेकिन ऐसा करने का सबसे अच्छा तरीका केवल कोड जोड़ना है, आप देख सकेंगे कि मेरा क्या मतलब है:सी # LINQ से XML

एक्सएमएल:

<?xml version="1.0" encoding="utf-8" ?> 
<customers> 
    <customer> 
    <id>1</id> 
    <name>Blah-face</name> 
    <Type>1</Type> 
    </customer> 
    <customer> 
    <id>2</id> 
    <name>Blah-face-2</name> 
    <Type>2</Type> 
    </customer> 
    <customer> 
    <id>3</id> 
    <name>Blah-face-3</name> 
    <Type>1</Type> 
    <SuperType>1</SuperType> 
    </customer> 
</customers> 

सी #:

XDocument linquee = XDocument.Load(path); 

var superType = (from c in linquee.Descendants("customer") 
       where (c.Element("SuperType").Value == "1") 
       select c).ToList(); 

यह एक अशक्त त्रुटि के साथ आता है - मैं एक शून्य मान के साथ यह पहले प्रत्येक ग्राहक को तत्व "महाप्रकार" जोड़ने के लिए की आवश्यकता होगी, या है वहां एक कामकाज जिसका मतलब होगा मेरे पास नहीं है ऐसा करने के लिए?

चीयर्स!

उत्तर

13

इस प्रयास करें:

var superType = (from c in from c in linquee.Descendants("customer") 
       where (string) c.Element("SuperType") == "1" 
       select c).ToList(); 

मूल रूप से यदि आप string को एक अशक्त XElement संदर्भ डाली, तो आप एक अशक्त संदर्भ (जो आप "1" के साथ तुलना कर सकते हैं) प्राप्त होंगे।

एक वैकल्पिक int? जो (IIRC) करने के लिए डाली एक अशक्त int? मूल्य अगर तत्व याद आ रही है वापस आ जाएगी, लेकिन धमाके जाना हो सकता है अगर यह वर्तमान लेकिन गैर-संख्यात्मक है:

var superType = (from c in from c in linquee.Descendants("customer") 
       where (int?) c.Element("SuperType") == 1 
       select c).ToList(); 
+0

परफेक्ट, नल की जांच करने से चीजों को और अधिक सरल बनाता है। एक पल में "टिक" होगा। –

6

आप

where c.Element("SuperType") != null 
&& [your other criteria] 
3

अगर SuperType तत्व यह मान से पढ़ने के लिए प्रयास करने से पहले से मौजूद है आप की जाँच की कोशिश की है बस अशक्त के लिए एक जांच जोड़ने में सक्षम होना चाहिए?

... 
where (c.Element("SuperType") != null && c.Element("SuperType").Value == "1") 
... 
0

मैं इसे करना होगा

var superType = linquee.Descendants("customer"). 
    Where(c => c.Element("SuperType") != null 
     && c.Element("SuperType").Value == "1"); 
0

भी .. इस थोड़े साफ एक्सटेंशन, कुछ तरह के साथ सामान के लिए सक्षम होना चाहिए

public string Element_valStr(XElement xElm, string xName) 
{ 
    if (xElm.Element(xName) == null) return string.empty; 
    return xElm.Element(xName).Value; 
} 
: इस तरह

और फिर बस:

var superType = (from c in linquee.Descendants("customer") 
        where (c.Element_valStr("SuperType") == "1") 
        select c).ToList(); 
0

मैं का उपयोग कर एक अच्छा समाधान नहीं मिला कोई भी() एक सशर्त ऑपरेटर के साथ संयोजन में:

result = entry.Elements(ArbitraryElement).Any() ? (entry.Element(ArbitraryElement).Attributes(ArbitraryAttribute).Any() ? entry.Element(ArbitraryElement).Attribute(ArbitraryAttribute).Value : "-1") : "-1"

चाल) एक साथ किसी भी साथ तत्वों (उपयोग करने के लिए है() यह जांचने के लिए कि तत्व मौजूद है (गुणों के लिए समान) (

तो इस उदाहरण के लिए यह कुछ ऐसा होगा:

var superType = from c in linquee.Descendants("customer") 
       select c.Elements("SuperType").Any() ? c.Element("SuperType").Value : "0"; 
संबंधित मुद्दे