0

私は、会社のデータを取得し、データベースで提供されているパターンに基づいて XML としてエクスポートするエクスポート エンジンを作成中です。実装する必要があるエクスポートの 1 つは、要素の値が null の場合、要素にxsi:nil="true"属性を追加する必要があります。

エクスポート リスト内の各項目をループ処理し、その内部 XElement オブジェクトを (ルールに基づいて) 生成し、.ToString() 表現をデータベースに保存します。すべての内部ピースが生成された後、それらはデータベースから取得され、解析されて XElement オブジェクトに戻され、外部 xml ルートに追加されます。(すべてをデータベースに保存すると、エクスポートを一時停止したり、サーバーの再起動後にエクスポートを再開したりできます)

外側のルートに xsi 名前空間を指定しましたが、これは (解析された) 内側の XElement を追加するときに機能しません。

これは、私のコードが現在どのように機能するかを表しています。

//Generate inner xml
XElement innerElement = new XElement("inner");
XNamespace xsi = @"http://www.w3.org/2001/XMLSchema-instance";
XAttribute attrib = new XAttribute(xsi + "nil", "true");
innerElement.Add(attrib);

//Mock out saving XElement as string
string innerString = innerElement.ToString();
XElement innerElementParsed = XElement.Parse(innerString);

//Add innerxml to outer xml root
XNamespace outerXsi = "http://www.w3.org/2001/XMLSchema-instance";
XAttribute outerAttrib = new XAttribute(XNamespace.Xmlns + "xsi", outerXsi);
XElement outerElement = new XElement("Outer", outerAttrib);
outerElement.Add(innerElementParsed);
return outerElement.ToString();

次の結果が得られます

<Outer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <inner p1:nil="true" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance" />
</Outer>

拡張名を使用しないようにする方法がわかりません(このページの下部に向かって: http://msdn.microsoft.com/en-us/library/system.xml.linq.xnamespace.aspx )

途中でデータベースに保存する「.ToString()」ステップを削除できた場合、すべての XElement 項目を追加すると名前空間が正しく解決されるため、この問題は発生しません。

私の質問は次のとおりです。解析を制御して、展開された名前 p1 を使用せず、代わりに外側の XElement の名前空間を使用するように指示する方法はありますか? または 、展開された名前を見て、それがルートと同じであることを確認して削除するものはありますか?

4

1 に答える 1