繁体   English   中英

XmlNode.InnerText

[英]XmlNode.InnerText

我们有这样的XML:

<Example>
  <Node>Some text here
    <ChildNode>Child 1</ChildNode>
    <ChildNode>Child 2</ChildNode>
  </Node>
</Example>

我们正在使用XmlDocument对此进行解析。

当我们拥有“ Node”元素的XmlNode时, XmlNode.InnerText我们返回以下内容:

"Some text hereChild 1Child2"

我们如何获得Node元素的内部文本而没有子节点的内部文本? 我们真的不希望使用任何RegEx或字符串拆分来完成此操作。

注意:我们也不想切换到使用其他类集来解析此XML,这将是太多的代码更改。

var doc = new XmlDocument();
doc.LoadXml(xml);
var text = doc.SelectSingleNode("Example/Node/text()").InnerText; // or .Value

退货

"Some text here\r\n    "

text.Trim()返回

"Some text here"

怎么样:

XmlDocument d=new XmlDocument();
d.LoadXml(@"<Example>
  <Node>Some text here
    <ChildNode>Child 1</ChildNode>
    <ChildNode>Child 2</ChildNode>
  </Node>
</Example>");
var textNodeValues=d.DocumentElement
    .FirstChild
    .ChildNodes
    .Cast<XmlNode>()
    .Where(x=>x.NodeType==XmlNodeType.Text)
    .Select(x=>x.Value);

您可以像这样实现:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml("<Example><Node>Some text here<ChildNode>Child 1</ChildNode><ChildNode>Child 2</ChildNode></Node></Example>");
    XmlNode node = doc.SelectSingleNode( "Example/Node" );
    if (node.HasChildNodes)
    {
        string value = node.FirstChild.Value;
    }

据我所知,没有直接的方法可以做到这一点。 您必须遍历子文本节点并自己构建串联的文本:

using System.Text;
using System.Xml;

public string GetImmediateInnerText(XmlNode node)
{
    StringBuilder builder = new StringBuilder();
    foreach (XmlNode child in node.ChildNodes) {
        if (child.NodeType == XmlNodeType.Text) {
            builder.Append(child.Value);
        }
    }
    return builder.ToString();
}

您也可以使用text() XPath表达式,就像@abatishchev一样:

public string GetImmediateInnerText(XmlNode node)
{
    StringBuilder builder = new StringBuilder();
    foreach (XmlNode child in node.SelectNodes("text()")) {
        builder.Append(child.Value);
    }
    return builder.ToString();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM