使用 LINQ 使用格式读取 XML
Read XML using LINQ using formatting
我正在尝试编写一个 Linq 查询来解析我的 XML 树(实际上是 SQL 解构为 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>
我正在尝试找出 table 名称(SelectionTarget
节点)。 WhiteSpace
节点是介于值之间的 blank/white space。
所以我期望的输出是这样的 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
。有什么建议吗?
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
节点:
<WhiteSpace></WhiteSpace>
<Other>bd_orm</Other>
<Period>.</Period>
<Other>dbo</Other>
<Period>.</Period>
<Other>bal_impacts_t</Other>
<WhiteSpace></WhiteSpace>
<Other>t1</Other>
您可以在构造查询之前添加空格:
foreach (var ws in xDoc.Descendants("WhiteSpace"))
{
ws.Value = " ";
}
简单地select WhiteSpace
节点的 space 和所有其他节点的字符串值,然后连接结果:
var parts = doc.Descendants("SelectionTarget")
.Elements()
.Select(e => e.Name == "WhiteSpace" ? " " : (string)e);
var text = string.Concat(parts);
我正在尝试编写一个 Linq 查询来解析我的 XML 树(实际上是 SQL 解构为 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>
我正在尝试找出 table 名称(SelectionTarget
节点)。 WhiteSpace
节点是介于值之间的 blank/white space。
所以我期望的输出是这样的 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
。有什么建议吗?
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
节点:
<WhiteSpace></WhiteSpace>
<Other>bd_orm</Other>
<Period>.</Period>
<Other>dbo</Other>
<Period>.</Period>
<Other>bal_impacts_t</Other>
<WhiteSpace></WhiteSpace>
<Other>t1</Other>
您可以在构造查询之前添加空格:
foreach (var ws in xDoc.Descendants("WhiteSpace"))
{
ws.Value = " ";
}
简单地select WhiteSpace
节点的 space 和所有其他节点的字符串值,然后连接结果:
var parts = doc.Descendants("SelectionTarget")
.Elements()
.Select(e => e.Name == "WhiteSpace" ? " " : (string)e);
var text = string.Concat(parts);