linq xml提取标签之间的文本

时间:2015-07-01 16:40:19

标签: c# xml linq

我使用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;不提取标签之间的文本。 有任何技巧可以执行吗?

2 个答案:

答案 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

确实,这确实是数据格式的问题。