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"不会提取标记之间的文本。有什么表演技巧吗?

linq-xml提取标记之间的文本

使用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

事实上,这似乎是数据格式的一个问题。