2009-11-24 16 views
16

के साथ मैं एक तृतीय पक्ष xml api के खिलाफ काम कर रहा हूं। उन्होंने निम्न के समान एक आवश्यक xml संरचना परिभाषित की है।xml तत्व नाम कोलन

<ns1:E xmlns:ns1="schema"> 
<ns1:B> 
    <ns2:S> 
     <ns2:V> 
      <ns2:Bl /> 
     </ns2:V> 
    </ns2:S> 
</ns1:B> 
</ns1:E> 

ऐसी जानकारी के साथ एक SQL तालिका है जो मुझे इस XML प्रारूप में डालने की आवश्यकता है। मेरे पास डेटा प्राप्त करने के लिए LINQ से SQL एडाप्टर है और मैं XML दस्तावेज़ बनाने के लिए System.Xml का उपयोग कर रहा हूं।

XmlDocument.CreateElement("ns1:E"); etc 

यह ठीक जब तक मैं तत्व के नाम से कोलन को दूर के रूप में काम करता है। कोलन के साथ, कोलन का दाहिना हाथ तत्व तत्व नाम में है। मुझे पता है कि कोलन एक नो-नो हैं लेकिन मेरे पास कोई तीसरा पक्ष एपीआई निर्देशित करने पर कोई नियंत्रण नहीं है।

इस के आसपास होने के मेरे विकल्प क्या हैं? तत्वों के नामों में कोलन को मजबूर करने के कोई उपयोगी तरीके हैं? मुझे XMLDocument का उपयोग करने की आवश्यकता नहीं है, लेकिन यह सुनिश्चित नहीं है कि मुझे और कौन सी विधि मिल जाएगी।

अद्यतन: मुझे एहसास है कि <ns1: नामस्थान को संदर्भित करता है। और हाँ, वहाँ 2. जब एक्सएमएल बाहर लेखन, मैं यह काम करता है, तो मैं कहता हूँ कर सकते हैं -

XmlDocument.CreateElement(ns1:E", "http://schema); 

हालांकि, इस के XML आउटपुट

<ns1:E xmlns:ns1="http://schema"> 

है मैं सिर्फ साथ XmlDocument.CreateElement("ns1:E"); कहना कोई यूरी नहीं, तो आउटपुट सिर्फ <E> है। मैं नहीं चाहता कि आउटपुट में स्कीमा संदर्भ हो लेकिन मुझे उपसर्ग करने की आवश्यकता है। परिणाम मैं प्राप्त करना चाहता हूं बस <ns1:E> है। दोनों नम्सस्पेस शीर्ष पर घोषित किए गए हैं, जो मुझे लगता है कि इसका मतलब होगा कि मुझे उन्हें प्रत्येक नोड में घोषित करना होगा।

उत्तर

12

ठीक है, यह है। यहाँ

XmlDocument.CreateElement("prefix", "name", "uri"); 

संदर्भ अगर यह किसी और में मदद करता है:, http://msdn.microsoft.com/en-us/library/c22k3d47.aspx1

+1

मुझे एक ही समस्या है, यहां तक ​​कि यह विधि मेरे लिए काम नहीं करती है। आपने बस कैसे प्राप्त किया? –

0

कॉलन से पहले शब्द नामस्थान है। यदि आप "ns1: E" तत्व रखना चाहते हैं, तो आपको "ई" नामक तत्व बनाना होगा और इसके नामस्थान को "ns1" पर सेट करना होगा।

+0

धन्यवाद, समझ में आता है लेकिन किसी भी तरह से मुझे परिणाम नहीं मिल रहा है जिसे मैं अभी तक ढूंढ रहा हूं। यकीन नहीं है कि क्यों। अगर मैं यूरी या एनएस संदर्भ निर्दिष्ट करता हूं, तो तत्व का नाम सही है लेकिन यह उस आउटपुट के संदर्भ को जोड़ता है जिसे मैं नहीं चाहता हूं। अगर मैं नहीं करता, तो उपसर्ग जोड़ा नहीं जाता है। – nelsonwebs

5

कॉलन इंगित करते हैं कि वे तत्व ns1 namespace में हैं। जब आप एकाधिक स्कीमा का उपयोग कर रहे हों तो इसकी आवश्यकता होती है। दस्तावेज़ मानते हुए केवल ns1 का उपयोग करता है, यह अनिवार्य रूप से उन टैग्स में "ns1:" नहीं होने के बराबर है। अधिक जानकारी के लिए this guide देखें।

+3

वास्तव में, वे कॉलन इंगित करते हैं कि तत्व 'स्कीमा' नामस्थान में हैं। 'ns1' नामस्थान नहीं है; यह नामस्थान का संक्षेप है। यह बदल सकता है; नामस्थान का नाम नहीं हो सकता - एक अलग नामस्थान बनने के बिना नहीं। –

5

XML दस्तावेज़ तुम्हें तैनात वास्तव में ठीक से नहीं बनाया है, क्योंकि ns2 संक्षिप्त नाम तत्वों के कई करने के लिए आवंटित एक नाम स्थान से संबद्ध नहीं है।फिक्स्ड, यह इस प्रकार दिखाई देंगे:

<ns1:E xmlns:ns1="schema" xmlns:ns2="my-namespace"> 
    <ns1:B> 
    <ns2:S> 
     <ns2:V> 
     <ns2:Bl /> 
     </ns2:V> 
    </ns2:S> 
    </ns1:B> 
</ns1:E> 

ऊपर XML दस्तावेज़ शब्दार्थ बराबर है यह एक करने के लिए:

<s:E xmlns:s="schema"> 
    <s:B> 
    <S xmlns="my-namespace"> 
     <m:V xmlns:m="my-namespace"> 
     <s:Bl xmlns:s="my-namespace"/> 
     </m:V> 
    </S> 
    </s:B> 
</s:E> 

और यह एक करने के लिए:

<E xmlns="schema"> 
    <B xmlns="schema"> 
    <S xmlns="my-namespace"> 
     <V> 
     <Bl/> 
     </V> 
    </S> 
    </B> 
</E> 

सभी तीन मामलों में, E और B तत्व schema नामस्थान में हैं, जबकि S, V, और Bl तत्व ar my-namespace नामस्थान में ई।

नेमस्पेस उपसर्ग उपयोगी हैं, लेकिन कड़ाई से बोलते हुए वे अनावश्यक हैं। आप एक्सएमएल दस्तावेज बना सकते हैं, जैसे अंतिम उदाहरण, जो कि उपसर्ग का उपयोग नहीं करते हैं, और यह प्रत्येक तत्व के लिए नामस्थान स्पष्ट रूप से घोषित करता है।

यदि, एक्सएमएल प्रोसेसिंग में, आपको लगता है कि आप किसी दिए गए तत्व का उपयोग कर रहे उपसर्ग का ध्यान रखते हैं, तो आप लगभग निश्चित रूप से गलत हैं। एकमात्र चीज जिसकी आप परवाह करते हैं वह यह है कि यह किस नामस्थान से संबंधित है। उदाहरण के लिए, अगर मैं एक XmlDocument में उन तीन दस्तावेज़ों में से किसी लोड, निम्नलिखित कोड 'नीला' तत्व बाहर लिखेंगे:

XmlNamespaceManager ns = new XmlNamespaceManager(d.NameTable); 
    ns.AddNamespace("a", "schema"); 
    ns.AddNamespace("b", "my-namespace"); 
    Console.Write(d.SelectSingleNode("/a:E/a:B/b:S/b:V/b:Bl", ns).OuterXml); 

जब आप कहते हैं:

मुझे नहीं पता आउटपुट को स्कीमा संदर्भ होना चाहिए, लेकिन मुझे उपसर्ग होना चाहिए। परिणाम मैं प्राप्त करना चाहता हूं बस <ns1:E> है।

आप लगभग निश्चित रूप से त्रुटि में हैं। एक तत्व जिसका टैग ns1:E अर्थहीन है जब तक कि ns1 उपसर्ग किसी नामस्थान में मैप किया गया हो, या तो उस तत्व में या उसके पूर्वजों में से एक में। (इसके अलावा, एक नाम स्थान एक स्कीमा संदर्भ नहीं है।) आप

CreateElement("ns1", "E", "schema"); 

का उपयोग करते हैं तत्व बनाने के लिए, और फिर एक तत्व है कि पहले से ही schema नाम स्थान के लिए उपसर्ग होने के रूप में घोषित किया है ns1 से संलग्न है, तो डीओएम नामस्थान घोषणा के बिना तत्व को जोड़ देगा, क्योंकि उस संदर्भ में इसकी आवश्यकता नहीं है। यदि ns1 घोषित नहीं किया गया है (या कुछ schema के अलावा अन्य नाम स्थान abbreviating के रूप में घोषित किया जाता है), तो डोम तत्व पर एक नाम स्थान घोषणा के साथ ही उपसर्ग लागू हो जाएगा।

टीएल; डॉ: आप नेमस्पेस के बारे में परवाह करते हैं, नामस्थान उपसर्ग नहीं।

1

(मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं कुछ बराबर कर रहा हूँ और मृत चिकन लहर करने के लिए कैसे यह काम करते हैं। मैं यह तो मैं बाद में मिल सके दस्तावेजीकरण कर रहा हूँ बनाने के लिए पता लगा।)

string myName = "foo"; 

string ns_local = root.GetNamespaceOfPrefix("local"); 
string ns_x = root.GetNamespaceOfPrefix("x"); 

System.Xml.XmlNode newNode = doc.CreateNode(System.Xml.XmlNodeType.Element, "local", "MyTag", ns_local); 

System.Xml.XmlNode attr = doc.CreateNode(System.Xml.XmlNodeType.Attribute, "Key", ns_x); 
attr.Value = myName; 
newNode.Attributes.SetNamedItem(attr); 

attr = doc.CreateNode(System.Xml.XmlNodeType.Attribute, "MyAttr", ""); 
attr.Value = myName; 
newNode.Attributes.SetNamedItem(attr); 

nodeToAppendTo.AppendChild(newNode); 

यह मैं एक टैग

तरह
<local:MyTag x:Key="foo" MyAttr="foo" /> 
2
<ns1:E xmlns:ns1="schema"> 
    <ns1:B> 
     <ns2:S> 
     <ns2:V> 
      <ns2:Bl /> 
     </ns2:V> 
     </ns2:S> 
    </ns1:B> 
</ns1:E> 

तो ऊपर के रूप में प्रयोग XmlElement बनाएं यह नीचे के रूप में प्राप्त किया जा सकता उत्पादन प्राप्त करने के लिए लग रहा है कि देता है:

CreateElement("ns1","E", "schema"); 
CreateElement("ns1","B", "schema"); 
CreateElement("ns2","S", "schema"); 
CreateElement("ns2","V", "schema"); 
CreateElement("ns2","B1", "schema"); 

यहां तत्व "ई" मूल तत्व है, इसलिए यह स्कीमा के साथ "ns1" के साथ उपसर्ग करता है।

"बी", "एस", "वी", "बी 1" की तरह अन्य सभी उल्लेख तत्वों के बाद से यह उल्लेख किया उपसर्ग के साथ उपसर्ग 'ई' के बच्चे तत्वों रहे हैं, लेकिन फिर स्कीमा को प्रदर्शित करता है नहीं है बाल तत्व

और इसलिए आप मूल तत्व में स्कीमा के साथ वांछित आउटपुट प्राप्त करते हैं और केवल बाल तत्वों के लिए उपसर्ग प्राप्त करते हैं।

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