8

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/" />

属性は Attributes コレクションから削除されたようですが、XmlDocument.OuterXml からは削除されません。この属性の特別な意味のためだと思います。

問題は、.NET XML API を使用して xmlns 属性を削除する方法です。明らかに、これの文字列表現から属性を削除することはできますが、API を使用して同じことを行うことができるかどうか疑問に思います。

@Edit: .NET 2.0 について話しています。

4

9 に答える 9

3

Many thanks to Ali Shah, this thread solved my problem perfectly! here's a C# conversion:

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);
            }
于 2010-02-12T12:05:30.453 に答える
2

このスレッドでさまざまなオプションを見て、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

xml から xmlns を削除するために他に何もする必要はありません。

于 2009-12-09T16:21:14.037 に答える
2

これは名前空間を削除することになっていませんでしたか?

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

しかし、とにかくここでの接線では、System.Xml.Linq 名前空間 (.Net 3.0) の XElement、XDocument、およびXNameSpaceクラスは、古い XmlDocument モデルよりも優れています。試してごらん。私は中毒です。

于 2008-09-16T21:46:26.310 に答える
2

.NET DOM API は、本質的にしようとしている要素の名前空間の変更をサポートしていません。したがって、問題を解決するには、何らかの方法で新しいドキュメントを作成する必要があります。同じ .NET DOM API を使用して、名前空間を指定せずに新しい要素を作成できます。または、元の「名前空間」ドキュメントを、要素が名前空間修飾されていない新しいドキュメントに変換する XSLT スタイルシートを作成することもできます。

于 2008-09-16T20:51:51.417 に答える
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();
}
于 2013-01-11T22:14:13.190 に答える
0

はい、ELEMENT名であるため、明示的に削除することはできません。XmlTextWriterのWriteStartElementとWirteStartAttributeを使用し、属性を空のスペースに置き換えると、作業が完了する可能性があります。

今チェックしています。更新されます。

于 2008-09-16T20:20:24.067 に答える
0

たぶんXmlNamespaceManagerを介して?http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspxですが、これは単なる推測です。

于 2008-09-16T20:35:09.880 に答える
0

xml を文字列に変換し、その文字列から xmlns を削除してから、この文字列を使用して名前空間を持たない別の XmlDocument を作成できます。

于 2009-06-10T09:36:19.643 に答える
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")
于 2015-03-28T18:40:13.003 に答える