2015-06-11 43 views
2

我正在嘗試編寫一個將解析我的XML樹(實際上是將SQL解構成XML樹)的Linq查詢。使用LINQ使用格式化讀取XML

我的XML看起來像這樣

<SqlRoot> 
    <SqlStatement> 
    <Clause> 
     <OtherKeyword>select</OtherKeyword> 
     <WhiteSpace></WhiteSpace> 
     <Other>t1</Other> 
     <Period>.</Period> 
     <Other>empid</Other> 
     <WhiteSpace></WhiteSpace> 
    </Clause> 
    <Clause> 
     <OtherKeyword>from</OtherKeyword> 
     <SelectionTarget> 
     <WhiteSpace></WhiteSpace> 
     <Other>bd_orm</Other> 
     <Period>.</Period> 
     <Other>dbo</Other> 
     <Period>.</Period> 
     <Other>bal_impacts_t</Other> 
     <WhiteSpace></WhiteSpace> 
     <Other>t1</Other> 
     </SelectionTarget> 
    </Clause> 
    </SqlStatement> 
</SqlRoot> 

我想挑出表名(SelectionTarget節點)。 WhiteSpace節點在值之間是空白/空格。

所以我期望的輸出是這樣的bd_orm.dbo.bal_impacts_t t1,但我無法弄清楚如何通過在中間加入whitespace來做到這一點。

我想這

var xxx = (from res in xDoc.Descendants("Clause").Descendants("SelectionTarget") select res); 

Console.WriteLine(xxx.DescendantNodesAndSelf().OfType<XElement>().First().Value); 

,但它顯然不能,因爲我不知道該如何兼顧whitespace節點和轉換是爲實際whitespace。有什麼建議麼?

回答

1

硅mply爲WhiteSpace節點選擇空間,併爲所有其他節點選擇字符串值,然後連接結果:

var parts = doc.Descendants("SelectionTarget") 
    .Elements() 
    .Select(e => e.Name == "WhiteSpace" ? " " : (string)e); 

var text = string.Concat(parts); 
1
var nodes = (from res in xDoc.Descendants("Clause") 
          .Descendants("SelectionTarget") 
          .Descendants() 
      select res); 
string name = String.Join("", nodes.Select(n=>n.Name == "WhiteSpace"?" ":n.Value)); 

名稱:bd_orm.dbo.bal_impacts_t t1

demo

節點:

<WhiteSpace></WhiteSpace> 
<Other>bd_orm</Other> 
<Period>.</Period> 
<Other>dbo</Other> 
<Period>.</Period> 
<Other>bal_impacts_t</Other> 
<WhiteSpace></WhiteSpace> 
<Other>t1</Other> 
0

你可以構建查詢之前加空格:

foreach (var ws in xDoc.Descendants("WhiteSpace")) 
{ 
     ws.Value = " "; 
}