2016-09-23 11 views
0

私たちは、NewtonSoftの標準.NET機能を使用してXMLからJSONを作成しています。 @Json:Array = "true"のように値を配列として定義するために名前空間を使用する必要があることがわかっていますが、SQL ServerからXMLを返すときに名前空間を使用しようとするといくつかの問題が発生します。私たちがしたいのですがどのようなlinqを使用して特定の属性に名前空間を追加する方法は?

は@Json名前空間接頭辞を追加するために、SQL Serverのアレイ=「true」にして、後処理XMLで指定しています。

は(多分LINQを使用して?)XElementの方法我々は1本のヒットでこれを行うことができ、「アレイ」と呼ばれるすべての属性にJSONの名前空間接頭辞を追加し、すなわち、ありますか? XElementを文字列に変換して検索/置換(これまでのテストではこれまで行っていました)や、要素がツリーウォークしないようにしたいと思っています演奏者。

+0

[MCVE]あなたが提供したい場合には役立つだろう - ということに注意してくださいすべてのJSONとデータベースの部分は無関係ですが、それらをバックグラウンドの動機付けとして含めることは妥当かもしれません。 –

+0

文字列に変換する必要はありませんが、ツリーウォークは... –

答えて

0

あなたはツリーウォークをしなければならないと私は信じています。

あなたが場所ですべての属性を保持したい場合は、XElement.ReplaceAttributesを使用する必要があるだろう。それ以外の場合は、古いものを削除して新しいものを追加することができます。 (あなたはXAttributeの名前を変更することはできません。)

サンプルコードを:

using System.Linq; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     var xdoc = new XDocument(
      new XElement("root", 
       new XElement("child1", 
        new XAttribute("NotArray", "foo"), 
        new XAttribute("Array", "bar") 
       ), 
       new XElement("child2", 
        new XAttribute("Array", 0), 
        new XAttribute("Y", 1) 
       ) 
      ) 
     ); 
     Console.WriteLine("Before:"); 
     Console.WriteLine(xdoc); 
     Console.WriteLine(); 

     XNamespace ns = "@Json"; 
     var attributesToReplace = xdoc 
      .Descendants() 
      .Attributes("Array") 
      .ToList(); 
     foreach (var attribute in attributesToReplace) 
     { 
      var element = attribute.Parent; 
      attribute.Remove(); 
      element.Add(new XAttribute(ns + "Array", attribute.Value)); 
     } 
     Console.WriteLine("After:"); 
     Console.WriteLine(xdoc); 
    } 
} 

出力:

Before: 
<root> 
    <child1 NotArray="foo" Array="bar" /> 
    <child2 Array="0" Y="1" /> 
</root> 

After: 
<root> 
    <child1 NotArray="foo" p2:Array="bar" xmlns:p2="@Json" /> 
    <child2 Y="1" p2:Array="0" xmlns:p2="@Json" /> 
</root> 
関連する問題