c# - Retrieving multiple XML elements with LINQ by attributes -


इस XML को दिया गया है:

  & lt;? Xml संस्करण = "1.0" एन्कोडिंग = " यूटीएफ -8 "? & Gt; & LT; queryableData & gt; & Lt; तालिका प्रदर्शननाम = "जहाजों" dbName = "उद्धरण" & gt; & Lt; विदेशी कुंजी स्तंभ = "ग्राहक आईडी" संदर्भ = "ग्राहक पंजीकरण" / & gt; & Lt; विदेशी कि कॉलम = "कोटस्टैटस आईडी" संदर्भ = "कोटस्टैटस" / & gt; & LT; क्षेत्रों & gt; & Lt; फ़ील्ड प्रदर्शननाम = "उद्धरण शुल्क" dbColumn = "उद्धरण चिह्न" प्रकार = "संख्या" / & gt; & Lt; फ़ील्ड displayName = "कुल वजन" dbColumn = "TotalWeight" प्रकार = "संख्या" / & gt; & Lt; / क्षेत्रों & gt; & Lt; / तालिका & gt; & Lt; तालिका प्रदर्शननाम = "ग्राहक" dbName = "ग्राहक पंजीकरण" & gt; & LT; क्षेत्रों & gt; & Lt; फ़ील्ड प्रदर्शननाम = "प्रथम नाम" dbColumn = "FirstName" प्रकार = "टेक्स्ट" / & gt; & Lt; फ़ील्ड प्रदर्शननाम = "अंतिम नाम" dbColumn = "LastName" प्रकार = "टेक्स्ट" / & gt; & Lt; / क्षेत्रों & gt; & Lt; / तालिका & gt; & Lt; / queryableData & gt;   

मुझे एक गुमनाम ऑब्जेक्ट प्रकार की एक सूची प्राप्त करना है जिसमें केवल "उद्धरण" तालिका के लिए DisplayName, DbColumn और प्रकार फ़ील्ड शामिल हैं।

मुझे मिल सकता है निम्न लिनकों से XML कोड के लिए दोनों तालिकाओं की एक सूची:

  var xml = XElement.Load (@ "सी: \ सैंडबॉक्स \ queryable.xml"); // तालिकाएं var तालिकाओं = el in xml.Elements ("table") नया {text = el.Attribute ("displayName") चुनें। मान, मान = el.Attribute ("dbName")। मान};   

लेकिन मुझे यकीन नहीं है कि फ़ील्ड के मूल्य को कैसे प्राप्त करें जहां तालिका तत्व का डीबीएन नाम विशेषता "उद्धरण" है मुझे मिल गया निकटतम एक सूची है जिसमें मूल्यों की एक सूची होती है, जिसमें एक आइटम के साथ गुमनाम वस्तुओं की सूची के बजाय dbColumn / displayName जोड़ी है:

  var स्तंभ = el xml में तत्व ("तालिका") जहां el.Attribute ("dbName")। मान। एक्लॉल्स ("उद्धरण") नए लुकअपडेटा {टेक्स्ट = एल.एल. एलिमेंट्स ("फ़ील्ड्स") का चयन करें। तत्व ("फ़ील्ड")। विशेषताएँ () जहां (एक्स = & gt; x.Name == "displayName")। चुनें (x = & gt; x.Value), मान = el.Elements ("fields")। तत्व ("फ़ील्ड")। विशेषताएँ ()। (X = & gt; x.Name == "dbColumn")। चुनें (x = & gt; x.Value)};   

इसलिए मुझे इसकी एक सूची में उम्मीद है:

LookupData # 1

पाठ: "भाव का प्रभार" < / P>

मूल्य: "उद्धरण चिह्न"

लुकअपडाटा # 2

पाठ: "कुल वजन"

मान: "TotalWeight"

और इसके बजाय मैं इसे प्राप्त कर रहा हूं:

LookupData # 1

टेक्स्ट: दो स्ट्रिंग्स वाली सूची: [ 0] = "उद्धरण प्रभार", [1] = "कुल वजन"

मान: दो स्ट्रिंग्स वाली सूची: [0] = "उद्धरण चिह्न", [1] = "कुलवाइट" < / Div>

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

  var परिणाम = xml.Elements ("table")। कहां (एल = & gt; एल। विशेषता ("डीबीएन")। मान। एक्लॉल्स ("उद्धरण"))। // 1 SelectMany (el = & gt; el.Elements ("फ़ील्ड्स")। तत्व ("फ़ील्ड"))। // 2 चुनें (f = & gt; नया {text = f. गुण ()। कहां (x = & gt; x.Name == "displayName")। चुनें (x = & gt; x.Value)। FirstOrDefault (), मान = एफ। विशेषताएँ ()। जहां (x = & gt; x.Name == "dbColumn")। चुनें (x = & gt; x.Value)। FirstOrDefault ()}) // 3;   

स्पष्टीकरण:

  1. हम तत्वों का चयन करें जहां dbName == "उद्धरण"
  2. सभी का उन तत्वों का, हम सभी फ़ील्ड तत्वों का चयन करते हैं और परिणाम को SelectMany के उपयोग के साथ समतल करते हैं। परिणाम एक IEnumerable & lt; XElement & gt; होगा।
  3. प्रत्येक फ़ील्ड के लिए, हम टेक्स्ट गुण सेट के साथ एक अनाम प्रकार का चयन करें "डिस्प्लेनाम" नाम की विशेषता और "code" मूल्य गुण "dbColumn" नाम की पहली विशेषता के मूल्य पर सेट है

    आपके दृष्टिकोण के साथ समस्या मूल रूप से थी, जो आपने चरण 2 में गुमनाम प्रकार के निर्माण के अंदर। या दूसरे शब्दों में: आपने "फ़ील्ड" तत्व के अनुसार नहीं, प्रत्येक "उद्धरण" तत्व के लिए एक गुमनाम प्रकार का उदाहरण बनाया है।

Comments