2014-01-13 45 views
-1

我想創建以下XML元素:在C#中使用LINQ創建特定的XML

<result> 
    <object1>VALUE_1</object1> 
    <object2>VALUE_2</object2> 
    <object3>VALUE_3</object3> 
    <object4>VALUE_4</object4> 
</result> 

我有以下代碼:

XElement xResult = new XElement("node_results", 
       from 
        a in entityResult 
       select new XElement("result" 
        , new XElement("object1", a.VALUE_1 
        , new XElement("object2", a.VALUE_2) 
        , new XElement("object3", a.VALUE_3) 
        , new XElement("object4", a.VALUE_4) 
       ) 
      ); 

此代碼生成此XML:

<node_results> 
    <result> 
     <object1>VALUE_1</object1> 
     <object2>VALUE_2</object2> 
     <object3>VALUE_3</object3> 
     <object4>VALUE_4</object4> 
    </result> 
</node_results> 

如何生成沒有標籤「node_results」的結果xml?

我已經使用這些代碼,但產生錯誤:

XElement xResult = 
       from 
        a in entityResult 
       select new XElement("result" 
        , new XElement("object1", a.VALUE_1 
        , new XElement("object2", a.VALUE_2) 
        , new XElement("object3", a.VALUE_3) 
        , new XElement("object4", a.VALUE_4) 
      ); 

or 

XElement xResult = new XElement("result", 
       from 
        a in entityResult 
       select 
        new XElement("object1", a.VALUE_1) 
        , new XElement("object2", a.VALUE_2) 
        , new XElement("object3", a.VALUE_3) 
        , new XElement("object4", a.VALUE_4) 
       ) 
      ); 
+1

什麼錯誤?始終將它們包含在一個問題中。 –

回答

0

entityResult顯然是結果的數組,所以你不能把它分配到的XElement,但必須爲它們創建一個IEnumerable的。

這應該工作:

var xResults = 
      from 
       a in entityResult 
      select new XElement("result" 
       , new XElement("object1", a.VALUE_1 
       , new XElement("object2", a.VALUE_2) 
       , new XElement("object3", a.VALUE_3) 
       , new XElement("object4", a.VALUE_4) 
     ); 

最重要的區別是,xResults將是一個IEnumerable<XElement>,所以結果是一樣的東西:

<result> 
    <object1>VALUE_1</object1> 
    <object2>VALUE_2</object2> 
    <object3>VALUE_3</object3> 
    <object4>VALUE_4</object4> 
</result> 
<result> 
    <object1>VALUE_1</object1> 
    <object2>VALUE_2</object2> 
    <object3>VALUE_3</object3> 
    <object4>VALUE_4</object4> 
</result> 
... 

你會因此需要包裝他們在一個根元素。第二種方法是枚舉其中一個結果:

XElement xResult = new XElement("result" 
       , new XElement("object1", entityResult[0].VALUE_1 
       , new XElement("object2", entityResult[0].VALUE_2) 
       , new XElement("object3", entityResult[0].VALUE_3) 
       , new XElement("object4", entityResult[0].VALUE_4)); 

這真的取決於您需要或想要做什麼。

爲了防止自動關閉的標籤,只是空字符串替換空值:

XElement xResult = new XElement("result" 
       , new XElement("object1", entityResult[0].VALUE_1 ?? "" 
       , new XElement("object2", entityResult[0].VALUE_2 ?? "") 
       , new XElement("object3", entityResult[0].VALUE_3 ?? "") 
       , new XElement("object4", entityResult[0].VALUE_4 ?? "")); 

操作員檢查,如果左側等於空,並且不是,則輸出該左側值,否則輸出右側值。

編輯2:顯然這不起作用 - 所以另一個解決方案 - How do you force explicit tag closing with Linq XML?。請看R. Martinho Fernandes的答案 - 他有一個創建自定義XMLWriter的完整示例,可以解決您的問題。

+0

此代碼有效。謝謝MZetko。 當元素的值爲空時,是否有方法不顯示標記? 當爲null時,xml顯示一個標記。 – user3190202

+0

然後你可以使用條件如果在代碼中爲null:例如第二行 - ... entityResult [0] .VALUE_2 ?? 「」) –

+0

用樣本更新了我的答案。 –

0

我假設entityResult是一個只包含一個元素的集合。

var a = entityResult.Single(); 
XElement xResult = XElement("result", 
    new XElement("object1", a.VALUE_1), 
    new XElement("object2", a.VALUE_2), 
    new XElement("object3", a.VALUE_3), 
    new XElement("object4", a.VALUE_4));