سؤال

تعمل أساليب XmlElement.Attributes.Remove* بشكل جيد مع السمات العشوائية التي تؤدي إلى إزالة السمات التي تمت إزالتها من خاصية XmlDocument.OuterXml.لكن سمة Xmlns مختلفة.هنا مثال:

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.أعتقد أن هذا بسبب المعنى الخاص لهذه السمة.

والسؤال هو كيفية إزالة سمة xmlns باستخدام .NET XML API.من الواضح أنه يمكنني فقط إزالة السمة من تمثيل السلسلة لهذا، لكنني أتساءل عما إذا كان من الممكن القيام بنفس الشيء باستخدام واجهة برمجة التطبيقات.

@يحرر:أنا أتحدث عن .NET 2.0.

هل كانت مفيدة؟

المحلول

لا يدعم .NET DOM API تعديل مساحة اسم العنصر وهو ما تحاول القيام به بشكل أساسي.لذا، لكي تتمكن من حل مشكلتك، عليك إنشاء مستند جديد بطريقة أو بأخرى.يمكنك استخدام نفس واجهة برمجة تطبيقات .NET DOM وإنشاء عنصر جديد دون تحديد مساحة الاسم الخاصة به.وبدلاً من ذلك، يمكنك إنشاء ورقة أنماط XSLT لتحويل مستندك الأصلي "مساحات الأسماء" إلى مستند جديد لن تكون العناصر فيه مؤهلة لمساحة الاسم.

نصائح أخرى

لقد رأيت الخيارات المتنوعة في هذا الموضوع وتوصلت إلى حل الحل الخاص بي لإزالة سمات xmlns في ملف xml.هذا يعمل بشكل صحيح وليس لديه مشاكل:

'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 من xml.

شكرا جزيلا لعلي شاه، هذا الموضوع حل مشكلتي تماما!إليك تحويل C#:

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);
            }

ألم يكن من المفترض أن يؤدي هذا إلى إزالة مساحات الأسماء؟

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

ولكن على أي حال، على الظل هنا، فإن XElement وXDocument و XNameSpace تعد الفئات من مساحة الاسم System.Xml.Linq (.Net 3.0) أفضل كثيرًا من طراز XmlDocument القديم.جربها.انا مدمن.

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();
}

نعم، لأنه اسم ELEMENT، لا يمكنك إزالته بشكل صريح.من المرجح أن يؤدي استخدام WriteStartElement وWirteStartAttribute الخاص بـ XmlTextWriter، واستبدال السمة بمسافات فارغة إلى إنجاز المهمة.

أنا التحقق من ذلك الآن.سوف تتجدد.

ربما من خلال XmlNamespaceManager؟ http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx لكنه مجرد تخمين.

يمكننا تحويل xml إلى سلسلة، وإزالة xmlns من تلك السلسلة، ثم إنشاء XmlDocument آخر باستخدام هذه السلسلة، والتي لن تحتوي على مساحة الاسم.

هنا هو الحل الخاص بي على 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")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top