linq-xml提取标记之间的文本
本文关键字:文本 之间 提取 linq-xml | 更新日期: 2023-09-27 18:00:51
我正在使用Linq查询从Xml文件中提取数据。我试图从标签和额外数据(即文本(中提取数据,以保持顺序。换句话说,给出以下xml摘录:
<item>
<elementA id="1" value="aaaa">zazaz
<elementB id="2" value="bbbb">wwwww
<elementC id="3" value="cccc">sssss
</item>
我使用以下语句来提取:
XElement root = XElement.Parse(@"
<item>
<elementA id="1" value="aaaa"/>zazaz
<elementB id="2" value="bbbb"/>wwwww
<elementC id="3" value="cccc"/>sssss
</item>");
var nav = root.Descendants();
StringBuilder content=new StringBuilder();
foreach (var x in nav)
{
content.Append(x.Name.LocalName)
.Append(": id=")
.Append(x.Attribute("id").Value)
.Append(": value=")
.Append(x.Attribute("value").Value)
.Append(" extra data= ")
.Append(x.Value)
.Append("'n");
}
Console.WriteLine(content.ToString());
它提取:
elementA: id=1: value=aaaa extra data:
elementB: id=2: value=bbbb extra data:
elementC: id=3: value=cccc extra data:
而不是:
elementA: id=1: value=aaaa extra data: zazaz
elementB: id=2: value=bbbb extra data: wwwww
elementC: id=3: value=cccc extra data: sssss
因此,使用".Value"不会提取标记之间的文本。有什么表演技巧吗?
使用Nodes()
并检查NodeType
。
foreach (XNode node in root.Nodes())
{
if (node.NodeType == XmlNodeType.Element)
{
XElement elem = (XElement)node;
content.Append(elem.Name.LocalName)
.Append(": id=")
.Append(elem.Attribute("id").Value)
.Append(": value=")
.Append(elem.Attribute("value").Value);
}
else if (node.NodeType == XmlNodeType.Text)
{
XText text = (XText)node;
content.Append(" extra data= ")
.Append(text.Value.Trim())
.AppendLine();
}
}
您的XML格式似乎不正确。XML是一种要求关闭标记的严格格式。
<item>
<elementA id="1" value="aaaa">zazaz</elementA>
<elementB id="2" value="bbbb">wwwww</elementB>
<elementC id="3" value="cccc">sssss</elementC>
</item>
关闭您的标签,代码很可能会工作。
根据XElement.Value属性的MSDN文档,Value返回"一个包含此元素的所有文本内容的字符串。如果有多个文本节点,它们将被连接起来。">
考虑到这一点,请认为你走在了正确的轨道上,问题很可能是你的数据格式。
更新
如上所示,我修改了您的XML,并通过LINQPad4运行了您的代码。已返回以下内容:
elementA: id=1: value=aaaa extra data= zazaz
elementB: id=2: value=bbbb extra data= wwwww
elementC: id=3: value=cccc extra data= sssss
事实上,这似乎是数据格式的一个问题。