0

私はこれを持っています

XNamespace ns = "http://something0.com";
XNamespace xsi = "http://something1.com";
XNamespace schemaLocation = "http://something3.com";

XDocument doc2 = new XDocument(
    new XElement(ns.GetName("Foo"),
        new XAttribute(XNamespace.Xmlns + "xsi", xsi),
        new XAttribute(xsi.GetName("schemaLocation"), schemaLocation),
        new XElement("ReportHeader", GetSection()),
        GetGroup() 
    )
);

それは与えます

<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns:xsi="http://something1.com"
xsi:schemaLocation="http://something3.com" 
xmlns="http://something0.com">
    <ReportHeader xmlns="">
        ...
    </ReportHeader>
    <Group xmlns="">
        ...
    </Group>
</Foo>

しかし、私はこの結果を望んでいません、どうすればそれを行うことができますか?xmlns=""(が欠落していることに注意してください。)

<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns:xsi="http://something1.com"
xsi:schemaLocation="http://something3.com" 
xmlns="http://something0.com">
    <ReportHeader>
        ...
    </ReportHeader>
    <Group>
        ...
    </Group>
</Foo>
4

1 に答える 1

3

ここでの問題は、ドキュメントのデフォルトの名前空間を「http://something0.com」に設定しているが、この名前空間にない要素を追加していることです-それらはの名前空間にあります。

ドキュメントには、xmlns="http://something0.com" のデフォルトの名前空間があると記載されていますが、空の名前空間にある要素を追加します (追加したときに名前空間を指定しなかったため)。すべてが xmlns='' で明示的にマークされ、ドキュメントのデフォルトの名前空間にないことが示されます。

これは、xmlns="" を取り除くには 2 つの解決策があることを意味しますが、それぞれの意味は異なります。

1) ルート要素 (ドキュメントのデフォルトの名前空間を指定) に絶対に必要な場合xmlns="http://something0.com"- xmlns="" を「消す」には、要素を作成するときにこの名前空間を指定する必要があります。

// create a ReportHeader element in the namespace http://something0.com
new XElement(ns + "ReportHeader", GetSection())

2) これらの要素が名前空間 "http://something0.com" にあることが意図されていない場合は、ドキュメントの先頭にデフォルトとして追加しないでください (xmlns="http://something0. com" ビットをルート要素に追加します)。

XDocument doc2 = new XDocument(
     new XElement("foo",  // note - just the element name, rather  s.GetName("Foo")
          new XAttribute(XNamespace.Xmlns + "xsi", xsi),

予想されるサンプル出力は、これら 2 つの選択肢のうち前者を示しています。

于 2012-04-18T08:26:05.950 に答える