我使用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
所以,用&#34; .Value&#34;不提取标签之间的文本。 有任何技巧可以执行吗?
答案 0 :(得分:2)
使用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();
}
}
答案 1 :(得分:0)
您的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,如上所示,并通过LINQPad 4运行你的代码。返回以下内容:
elementA: id=1: value=aaaa extra data= zazaz
elementB: id=2: value=bbbb extra data= wwwww
elementC: id=3: value=cccc extra data= sssss
确实,这确实是数据格式的问题。