从 XmlNode 中提取“文本”值的最佳方法?

Posted

技术标签:

【中文标题】从 XmlNode 中提取“文本”值的最佳方法?【英文标题】:Neatest way to extract 'text' value from an XmlNode? 【发布时间】:2012-09-27 15:33:15 【问题描述】:

给定代码:

  var doc = new XmlDocument();
  doc.LoadXml(@"<a>
                    <b>test
                        <c>test2</c>
                    </b>
                </a>");
  var node = doc.SelectNodes("/a/b")[0];

然后我想提取 node b 的“文本”值 - 在本例中为“测试”,而不从所有子节点检索所有文本元素(如 .innerText 所做的那样)

我发现自己在求助于这段代码

 var elementText = node.ChildNodes.Cast<XmlNode>().First(a => a.NodeType == XmlNodeType.Text).Value;

不幸的是,node.Value 在这种情况下做了其他事情

有没有一种更简洁/内置的方式而不使用 linq 强制转换?这不涉及我做类似的事情;

foreach (var childNode in node.ChildNodes)
   if (childNode.NodeType==XmlNodeType.Text)
    ...

【问题讨论】:

第一个想法,放弃XmlDocument,使用XDocument。 msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx 如果您卡在 .net 2.0 或更早版本,请在问题中说明。 @Jodrell,不,我没有,感谢XDocument 的建议,我现在正在查看。 我说如果你想要最简洁的方式,你应该使用 XPath 【参考方案1】:

比起XmlDocument,我更喜欢XDocument,我认为它更容易使用。您可以使用Element 方法轻松获取值,找到“b”元素,然后使用Value 属性。

using(var stream = new MemoryStream())

    using(var streamWriter = new StreamWriter(stream))
    
        streamWriter.Write(@"<a>
                                 <b>test
                                     <c>test2</c>
                                 </b>
                             </a>");
        streamWriter.Flush();
        streamWriter.BaseStream.Seek(0, SeekOrigin.Begin);
        var doc = XDocument.Load(stream);
        Console.WriteLine(doc.Element("a").Element("b").FirstNode.ToString());
    

编辑:如 cmets 中所述,这将获得不正确的值。我已经正确更新了。

【讨论】:

同意,在.Net 3.5 上没有理由使用XmlDocument 它没有任何错误,我认为它只是首选。这是一个很好的 SO 链接,描述了 XDocument 和 XmlDocument 之间的区别:***.com/questions/1542073/xdocument-or-xmldocument 它没有得到“test”,它得到了“test\ntest2”【参考方案2】:

在 LINQ2XML 中你可以这样做

foreach(XNode elm in doc.Descendants("b").OfType<XText>())

//elm has the text

【讨论】:

【参考方案3】:

您想使用 node.InnerText 而不是 Value。所以你会有这个:

 foreach(XmlNode child in node.ChildNodes)
 
    if (string.IsNullOrEmpty(s))
    
        s = child.InnerText;
    
    else
    
        s = s.Replace(child.InnerText, "");
    
 

   s.Trim();

【讨论】:

不,伙计,这也将连接所有子文本元素,所以我会得到testtest2。我已经澄清了我的问题。

以上是关于从 XmlNode 中提取“文本”值的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

从时间戳中提取时间分辨率以获取列中特定值的最佳方法是啥?

从深度学习的表单中提取文本的最佳方法?

从视频游戏屏幕截图中提取尽可能多的文本的最佳方法是啥?

从句子python(波斯文本)中提取名字和姓氏的最佳方法

在java中从PDF中提取文本的最佳方法

如何从特定的二进制文件格式中提取文本?