xmlns

2011-10-16 11 views
8

के साथ descendants() या Elements() का उपयोग नहीं कर सकता मैं एक्सएमएल के साथ काम करने के लिए नया हूं, और एक spring.net कॉन्फ़िगरेशन फ़ाइल से एक विशिष्ट टैग प्राप्त करने का प्रयास करते समय मुझे एक अजीब समस्या का सामना करना पड़ा है। एक परीक्षण xml फ़ाइल के साथ समस्या को कम करने की कोशिश कर के बाद, मुझे पता चला है कि निम्नलिखित कोड लागू:xmlns

List<XElement> nodes = xmlFile.Descendants("B").ToList(); 

निम्न फ़ाइल के साथ एक गैर खाली सूची प्रदान करता है:

<?xml version="1.0" encoding="utf-8" ?> 
<A fakeAttribute="aaa"> 
    <B id="DbProvider"/> 
</A> 

लेकिन एक प्रदान करता है निम्न फ़ाइल के साथ खाली स्ट्रिंग:

<?xml version="1.0" encoding="utf-8" ?> 
<A xmlns="aaa"> 
    <B id="DbProvider"/> 
</A> 

विशेषता वाले फ़ाइलों के बीच एकमात्र अंतर।

मैं इसके लिए एक स्पष्टीकरण की कल्पना नहीं कर सकता। आपकी सहायता के लिए धन्यवाद.

उत्तर

8

आपको लगता है कि नाम स्थान में टैग के लिए खोज करने के लिए की जरूरत है:

XNamespace ns = "aaa"; 

xmlFile.Descendants(ns + "B").ToList() 
+0

धन्यवाद! उसने चाल की - लेकिन एक और समस्या का रास्ता भी खोला। मैं उदाहरण के लिए "बी" नामक वंशज प्राप्त कर सकता हूं, लेकिन "डीबी: प्रदाता" नामक वंशज नहीं प्राप्त कर सकता (न कि "डीबी" और न ही "डीबी: प्रदाता" का उपयोग करके), जो दुख की बात है कि मुझे क्या करना है। – Tomata

+0

डीबी एक अलग नेमस्पेस के रूप में सूचीबद्ध है। मेरी गलती। – Tomata

+3

@Tomata यदि आप नामस्थानों को अनदेखा करना चाहते हैं तो आप कुछ लिख सकते हैं: 'var lst = doc.Descendants()। जहां (p => p.Name.LocalName == "B")। ToList(); ' – xanatos

6

आप जब तत्वों के लिए क्वेरी नामस्थान निर्दिष्ट करना चाहिए।

आप इसे हार्ड-कोडिंग से बचने के लिए GetDefaultNamespace method का उपयोग कर सकते हैं। यह भी उपयोगी है अगर आप नहीं जानते कि यह समय से पहले क्या है।

उदाहरण:

var ns = xmlFile.GetDefaultNamespace(); 
var nodes = xmlFile.Descendants(ns + "B").ToList(); 
+0

एक में मामला, .GetDefaultNamespace काम नहीं किया क्योंकि एक्सएमएल स्कीमा लेखक xmlns का उपयोग नहीं कर रहा था बल्कि xmlns: foo। आप इसका उपयोग कर सकते हैं: var ns = xDoc.Root.GetNamespaceOfPrefix ("foo"); – Stonetip

9

बस पूर्णता के लिए:

var lst = doc.Descendants("{aaa}B").ToList(); 

(जो दूसरे से कहा सही है, लेकिन मैं एक और विकल्प :-) देना चाहता था)

अल्ट्रा के लिए पूर्णता के लिए, यदि आप नामस्थान को अनदेखा करना चाहते हैं:

var lst = doc.Descendants().Where(p => p.Name.LocalName == "B").ToList(); 
संबंधित मुद्दे