15

私は自分の仕事で .NET XML テクノロジを非常に広範囲に使用しています。私がとても気に入っていることの 1 つは XSLT エンジン、より正確にはその拡張性です。ただし、煩わしさの源であり続ける小さなピースが1つあります。大したことも、我慢できないこともありませんが、作成したい美しい XML を作成することが妨げられています。

私たちが行っていることの 1 つは、ノードをインラインで変換し、ある XML ドキュメントから別の XML ドキュメントにノードをインポートすることです。

悲しいことに、ノードを に保存するとXmlTextWriter(実際にXmlWriter.Create(Stream) は返されるものは何でも)、名前空間の定義は、必要である (以前に定義された) かどうかに関係なく、そこにすべてスローされます。次のような xml を取得します。

<root xmlns:abx="http://bladibla">  
     <abx:child id="A">  
         <grandchild id="B">
             <abx:grandgrandchild xmlns:abx="http://bladibla" />  
         </grandchild>  
     </abx:child>  
</root>

名前空間の定義に関して .NET が効率的であるように説得する方法について、誰か提案はありますか?

PS。追加のボーナスとして、デフォルトの名前空間をオーバーライドして、ノードを作成するときに変更したいと思います。

4

3 に答える 3

15

次のコードを使用します。

using (var writer = XmlWriter.Create("file.xml"))
{
    const string Ns = "http://bladibla";
    const string Prefix = "abx";

    writer.WriteStartDocument();

    writer.WriteStartElement("root");

    // set root namespace
    writer.WriteAttributeString("xmlns", Prefix, null, Ns);

    writer.WriteStartElement(Prefix, "child", Ns);
    writer.WriteAttributeString("id", "A");

    writer.WriteStartElement("grandchild");
    writer.WriteAttributeString("id", "B");

    writer.WriteElementString(Prefix, "grandgrandchild", Ns, null);

    // grandchild
    writer.WriteEndElement();
    // child
    writer.WriteEndElement();
    // root
    writer.WriteEndElement();

    writer.WriteEndDocument();
}

このコードは、目的の出力を生成しました。

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:abx="http://bladibla">
  <abx:child id="A">
    <grandchild id="B">
      <abx:grandgrandchild />
    </grandchild>
  </abx:child>
</root>
于 2011-06-26T07:36:40.017 に答える
2

これを試しましたか?

Dim settings = New XmlWriterSettings With {.Indent = True,
                                          .NamespaceHandling = NamespaceHandling.OmitDuplicates,
                                          .OmitXmlDeclaration = True}
Dim s As New MemoryStream
Using writer = XmlWriter.Create(s, settings)
    ...
End Using

興味深いのは「NamespaceHandling.OmitDuplicates」です。

于 2011-06-27T13:38:46.520 に答える
1

これがあなたが探しているものかどうかはわかりませんが、Xmlストリームへの書き込みを開始するときにこの種のコードを使用できます。

myWriter.WriteAttributeString("xmlns", "abx", null, "http://bladibla");

XmlWriterはそれを記憶し、それ以上書き直さないようにする必要があります。100%防弾ではないかもしれませんが、ほとんどの場合は機能します。

于 2011-06-21T07:27:44.670 に答える