2008-09-16 11 views
6

XmlElement.Attributes.Remove * विधियों के साथ xmlns विशेषता को कैसे निकालें, मनमानी विशेषताओं के लिए ठीक काम कर रहे हैं जिसके परिणामस्वरूप हटाए गए गुण XmlDocument.OuterXml प्रॉपर्टी से हटाए जा रहे हैं। Xmlns विशेषता हालांकि अलग है। यहाँ एक उदाहरण है:.NET XML API

XmlDocument doc = new XmlDocument(); 
doc.InnerXml = @"<Element1 attr1=""value1"" xmlns=""http://mynamespace.com/"" attr2=""value2""/>"; 
doc.DocumentElement.Attributes.RemoveNamedItem("attr2"); 
Console.WriteLine("xmlns attr before removal={0}", doc.DocumentElement.Attributes["xmlns"]); 
doc.DocumentElement.Attributes.RemoveNamedItem("xmlns"); 
Console.WriteLine("xmlns attr after removal={0}", doc.DocumentElement.Attributes["xmlns"]); 

जिसके परिणामस्वरूप उत्पादन

xmlns attr before removal=System.Xml.XmlAttribute 
xmlns attr after removal= 
<Element1 attr1="value1" xmlns="http://mynamespace.com/" /> 

है विशेषता गुण संग्रह से निकाल किया जा रहा है, लेकिन यह XmlDocument.OuterXml से न निकले। मुझे लगता है कि यह इस विशेषता के विशेष अर्थ के कारण है।

प्रश्न यह है कि .NET XML API का उपयोग कर xmlns विशेषता को कैसे निकालें। जाहिर है, मैं केवल इस स्ट्रिंग प्रस्तुति से विशेषता को हटा सकता हूं, लेकिन मुझे आश्चर्य है कि एपीआई का उपयोग करके वही काम करना संभव है।

@ एडिट: मैं .NET 2.0 के बारे में बात कर रहा हूं।

+0

मैं बस इस मुद्दे में भाग गया। अच्छा खोज! –

उत्तर

2

.NET डोम एपीआई तत्व के नामस्थान को संशोधित करने का समर्थन नहीं करता है जो आप अनिवार्य रूप से करने की कोशिश कर रहे हैं। इसलिए, अपनी समस्या को हल करने के लिए आपको एक नया दस्तावेज़ एक या दूसरे तरीके से बनाना होगा। आप उसी .NET DOM API का उपयोग कर सकते हैं और अपना नामस्थान निर्दिष्ट किए बिना एक नया तत्व बना सकते हैं। वैकल्पिक रूप से, आप एक एक्सएसएलटी स्टाइलशीट बना सकते हैं जो आपके मूल "नेमस्पेस्ड" दस्तावेज़ को एक नए रूप में बदल देता है जिसमें तत्व नामस्थान-योग्य नहीं होंगे।

+0

मुझे यकीन नहीं है, लेकिन जब तक कोई सकारात्मक जवाब नहीं है, मुझे विश्वास है कि यह सच है। – axk

0

हां, क्योंकि इसका एक तत्व नाम है, आप इसे स्पष्ट रूप से हटा नहीं सकते हैं। XmlTextWriter के WriteStartElement और WirteStartAttribute का उपयोग करके, और रिक्त स्थान के साथ विशेषता को प्रतिस्थापित करने से काम पूरा हो जाएगा।

मैं इसे अभी देख रहा हूं। अपडेट करूंगी।

0

शायद XmlNamespaceManager को कम करें? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx लेकिन यह सिर्फ एक अनुमान है।

+0

मैंने यह कोशिश की है, लेकिन इस वर्ग के साथ नामस्थान को हटाने का तरीका समझने में सक्षम नहीं है। – axk

1

क्या यह नामस्थानों को हटाना नहीं था?

XmlNamespaceManager mgr = new XmlNamespaceManager("xmlnametable"); 
mgr.RemoveNamespace("prefix", "uri"); 

लेकिन वैसे भी एक स्पर्शरेखा यहाँ पर, XElement, XDocument और System.Xml.Linq नाम स्थान से XNameSpace वर्गों (नेट 3.0) वर्ष XmlDocument मॉडल की तुलना में एक बेहतर बहुत कुछ कर रहे हैं। इसकी कोशिश करें। मैं आदी हूं।

+0

सुझाव के लिए धन्यवाद। निश्चित रूप से यह एक कोशिश दे देंगे। – axk

0

हम xml को एक स्ट्रिंग में परिवर्तित कर सकते हैं, उस स्ट्रिंग से xmlns को हटा सकते हैं, और उसके बाद इस स्ट्रिंग का उपयोग करके एक और XmlDocument बना सकते हैं, जिसमें नामस्थान नहीं होगा।

1

मैंने इस धागे में विभिन्न विकल्पों को देखा और xml में xmlns विशेषताओं को हटाने के लिए अपना स्वयं का समाधान हल करने आया। यह ठीक से काम कर और कोई मुद्दा नहीं है:

'Remove the Equifax/Transunian/Experian root node attribute that have xmlns and load xml without xmlns attributes. 
If objXMLDom.DocumentElement.NamespaceURI <> String.Empty Then 
    objXMLDom.LoadXml(objXMLDom.OuterXml.Replace(objXMLDom.DocumentElement.NamespaceURI, "")) 
    objXMLDom.DocumentElement.RemoveAllAttributes() 
    ResponseXML = objXMLDom.OuterXml 
End If 

एक्सएमएल से xmlns दूर करने के लिए कुछ और करने की कोई जरूरत नहीं है।

2

अली शाह के लिए बहुत धन्यवाद, इस धागे ने मेरी समस्या को पूरी तरह से हल किया!

var dom = new XmlDocument(); 
     dom.Load("C:/ExampleFITrade.xml)); 
     var loaded = new XDocument(); 
     if (dom.DocumentElement != null) 
      if(dom.DocumentElement.NamespaceURI != String.Empty) 
      { 
       dom.LoadXml(dom.OuterXml.Replace(dom.DocumentElement.NamespaceURI, "")); 
       dom.DocumentElement.RemoveAllAttributes(); 
       loaded = XDocument.Parse(dom.OuterXml); 
      } 
1
public static string RemoveXmlns(string xml) 
{ 
    //Prepare a reader 
    StringReader stringReader = new StringReader(xml); 
    XmlTextReader xmlReader = new XmlTextReader(stringReader); 
    xmlReader.Namespaces = false; //A trick to handle special xmlns attributes as regular 
    //Build DOM 
    XmlDocument xmlDocument = new XmlDocument(); 
    xmlDocument.Load(xmlReader); 
    //Do the job 
    xmlDocument.DocumentElement.RemoveAttribute("xmlns"); 
    //Prepare a writer 
    StringWriter stringWriter = new StringWriter(); 
    XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter); 
    //Optional: Make an output nice ;) 
    xmlWriter.Formatting = Formatting.Indented; 
    xmlWriter.IndentChar = ' '; 
    xmlWriter.Indentation = 2; 
    //Build output 
    xmlDocument.Save(xmlWriter); 
    return stringWriter.ToString(); 
} 
+2

आपके प्रस्तावित उत्तर का एक छोटा सा वर्णन वर्णन उपयोगी होगा। – Rob

0

यहाँ vb.net लोगों पर मेरे समाधान है: यहाँ एक सी # रूपांतरण है!

Dim pathXmlTransformado As String = "C:\Fisconet4\process\11790941000192\2015\3\28\38387-1\38387_transformado.xml" 
    Dim nfeXML As New XmlDocument 
    Dim loaded As New XDocument 

    nfeXML.Load(pathXmlTransformado) 

    nfeXML.LoadXml(nfeXML.OuterXml.Replace(nfeXML.DocumentElement.NamespaceURI, "")) 
    nfeXML.DocumentElement.RemoveAllAttributes() 

    Dim dhCont As XmlNode = nfeXML.CreateElement("dhCont") 
    Dim xJust As XmlNode = nfeXML.CreateElement("xJust") 
    dhCont.InnerXml = 123 
    xJust.InnerXml = 123777 

    nfeXML.GetElementsByTagName("ide")(0).AppendChild(dhCont) 
    nfeXML.GetElementsByTagName("ide")(0).AppendChild(xJust) 

    nfeXML.Save("C:\Fisconet4\process\11790941000192\2015\3\28\38387-1\teste.xml")