2

xml ドキュメントに要素を挿入するたびに、システムはそれに xmlns="" 属性を追加します。どうすればそれを取り除くことができますか? なぜそこにあるのですか?非常に単純な linqtoxml を使用しています。

単純な XML ファイルがあります (Xml 宣言行がなく、名前空間が含まれていることに注意してください)。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <PropertyGroup>
  </PropertyGroup>
</Project>

私は次のことを行います:

        //  1. Read in the Xml file
        XDocument testXml = XDocument.Load(@"C:\test.xml");

        //  2. Add in the extra node
        XNamespace ns = testXml.Root.Attribute("xmlns").Value;          // Get the existing namespace
        XElement newElement = new XElement("MyNewElement", "12345");    // Create the new element
        testXml.Element( ns + "Project").Add( newElement );          // Insert the new element into the document

        //  3. Write To Disk (without the xml header line)
        TextWriter tw = File.CreateText(@"C:\test2.xml");
        tw.Write(testXml.ToString());
        tw.Close();

ファイルを表示すると、次のようになります。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <PropertyGroup></PropertyGroup>
  <MyNewElement xmlns="">12345</MyNewElement>
</Project>

xmlns="" ビットを取り除く必要があります。元のドキュメントには名前空間があるため、新しい要素を追加するときに名前空間を含める必要があると思います。私は要素を挿入しようとしました:

    testXml.Element( "Project").Add( newElement );

しかし、それは要素が名前空間名を必要とするためであると想定しているnull参照例外を私に与え続けました。

もう一度解析して、すべての xmlns="" プロパティを削除することを考えましたが、うまくいかないようです。null 参照例外が発生し続けます。ここには名前空間の基本的な理解が欠けている可能性がありますが、周りを見回してもヒントが見つからないようです。

誰でもこれで正しい方向に向けることができますか?

乾杯ジャック。

4

3 に答える 3

1

これは質問への答えではありませんが、それでも私はあなたに伝えたかったのです。

saveメソッドを使用してxdocumentをファイルに保存できます。

XDocument testXml = XDocument.Load(@"C:\test.xml");
...
testXml.Save(@"c:\test.xml"); 

TextWriterを使用する必要はありません。

于 2009-05-14T11:53:48.280 に答える
1

XmlNsは「XML名前空間」です。基本的にはC++名前空間、Java / C#パッケージなどと同じですが、さまざまなXMLスキーマ(XSD、DTDなど)に対して解析するためのものです。

名前空間を指定せずにMyNewElementを作成しているため、DOMツリーはそれを空白の名前空間として解釈しています。ドキュメントルートは空白以外の名前空間を指定しているため、挿入するxmlns=""宣言はコードに応じて正しくなります。なんらかの方法でドキュメントに追加する前に、MyNewElementで名前空間を指定する必要があります。私はLinQXMLAPIに精通していませんが、以前のバージョンの.Net XMLパーサーでは、インスタンスCreateElement()からの呼び出しを使用XmlDocumentしてこれらの設定を正しく持ち上げることが推奨されていました。

Project要素のルックアップコードに基づいた大げさな推測で、LinQをまったく知らない場合は、次のように変更してみてください。

XElement newElement = new XElement("MyNewElement", "12345");

に:

XElement newElement = new XElement(ns + "MyNewElement", "12345");
于 2009-04-07T02:09:32.120 に答える
0

次のように、意図的に名前空間をxml文字列に入れる必要があります。

<serveur nom='nouveau serveur'  xmlns='urn:myLogConfig'>

コードでそれを削除します: (vb)

myXelement.SetAttributeValue("xmlns", Nothing)
于 2011-04-26T15:19:49.173 に答える