鉴于代码:
var doc = new XmlDocument();
doc.LoadXml(@"<a>
<b>test
<c>test2</c>
</b>
</a>");
var node = doc.SelectNodes("/a/b")[0];
然后我想提取node b
的'text'值 - 在本例中为“test”,而不从所有子节点中检索所有文本元素(如。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)
...
答案 0 :(得分:4)
我更喜欢XDocument
到XmlDocument
,我认为它更容易使用。您可以使用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());
}
}
编辑:如评论中所述,这将得到不正确的值。我已正确更新。
答案 1 :(得分:0)
您想使用node.InnerText而不是Value。所以你会有这个:
foreach(XmlNode child in node.ChildNodes)
{
if (string.IsNullOrEmpty(s))
{
s = child.InnerText;
}
else
{
s = s.Replace(child.InnerText, "");
}
}
s.Trim();
答案 2 :(得分:0)
在LINQ2XML中,你可以这样做
foreach(XNode elm in doc.Descendants("b").OfType<XText>())
{
//elm has the text
}