2015-09-17 16 views
5

名前空間接頭辞の有無にかかわらずデフォルト名前空間を指定したXMLファイルがあります。私はxml出力を生成するときに、すべてのxml要素の接頭辞を取得しています。既定の名前空間を使用しているので接頭辞を取り除く方法はありますか?名前空間もデフォルトとして定義されている場合、XDocumentは名前空間接頭辞を使用しません。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var xml = 
      "<root xmlns='default-namespace' xmlns:key='default-namespace'>" + 
      " <node1></node1>" + 
      " <node2></node2>" + 
      "</root>"; 
     var document = XDocument.Parse(xml); 
     var output = document.ToString(); 
    } 
} 

出力:私が期待する何

<key:root xmlns="default-namespace" xmlns:key="default-namespace"> 
    <key:node1></key:node1> 
    <key:node2></key:node2> 
</key:root> 

<root xmlns="default-namespace" xmlns:key="default-namespace"> 
    <node1></node1> 
    <node2></node2> 
</root> 

残念ながら、私は、重複した名前空間宣言を削除することはできません。私が使用している実際のXMLファイルは別のパーティーから提供されており、可能な限り少ない変更を加える必要があります。

+0

それはノード名の接頭辞が格納されていないXMLオブジェクトモデルにしていることLINQの欠点でありますシリアライザは、ツリーをXMLの文字列にシリアル化するときに、名前空間宣言属性に基づいてプレフィックスを選択する必要があります。 ToString()またはSaveの現在の実装では、名前空間の最後に見つかった名前空間宣言が 'に' 'xmlns = 'default-namespace'>結果が明らかに依存するものではありません。接頭辞が重要な場合は、XmlDocumentなどの別のツリーモデルを選択します。 –

答えて

-2

必要なXMLフォーマットを取得するString.Replaceメソッドを使用することができます...私の見解では

var xml ="<root xmlns='default-namespace' xmlns:key='default-namespace'>" + 
     " <node1></node1>" + 
     " <node2></node2>" + 
     "</root>"; 
     var document = XDocument.Parse(xml); 

     var output = document.ToString().Replace("key:", string.Empty); 
+0

これはハックと見なされます。ノード1に値のキーが含まれている場合: Martijn

関連する問題