假设我有一些XmlElement
;我们称之为element
。如果我想获取该元素的所有子节点,我可以调用element.ChildNodes
。如果我想要元素及其所有子元素的文本,那么我可以使用element.InnerText
。
但是,假设我有一些看起来像这样的XML:
<TopElement attr1="value1" attr2="value2">
This is the text I want.
<ChildElement1>This is text I don't want.</ChildElement1>
<ChildElement2>This is more text I don't want.</ChildElement2>
</TopElement>
如果我选择element.InnerText
,我得到的是:
这是我想要的文字。这是我的文字 不想要。这是我不做的更多文字 想。
如果我只想要TopElement中的文本但不想要任何子文本,我可以这样做:
Dim txt As String
For Each child As Xml.XmlNode In XmlElement.ChildNodes
If TypeOf child Is Xml.XmlText Then
txt = child.InnerText
Exit For
End If
Next
但这对我来说似乎很愚蠢。当然有更好的方法吗?
编辑:对不起我最初没有说明这个:我正在寻找一个不涉及LINQ的解决方案(我们在这里使用.NET 2.0处于黑暗时代)。
答案 0 :(得分:3)
您可以使用专门查找文本节点的XPath表达式(抱歉C#)
XmlText text = doc.SelectSingleNode("/TopElement/text()") as XmlText;
if (text != null)
{
Console.WriteLine(text.Value);
}
(其中doc
是包含您的XML的XmlDocument
)
答案 1 :(得分:2)
从技术上讲,TopElement中的文本是一个子节点。
class Program
{
static string xml = @"<Top>Text<child/><child/></Top>";
static void Main(string[] args)
{
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xml);
Console.WriteLine(xdoc.DocumentElement.ChildNodes[0].Value);
Console.ReadLine();
}
}
答案 2 :(得分:2)
XmlDocument document = new XmlDocument();
document.LoadXml(yourXml);
//Find the first child whos type is XmlText
var nodeYouWant = document.DocumentElement.ChildNodes.OfType<System.Xml.XmlText>().FirstOrDefault();
修改强>
由于你不能使用LINQ,你仍然可以使用好的'XQuery并请求节点文本
XmlNode nodeYouWant = document.DocumentElement.SelectSingleNode("./text()");
即使您想要的文本位于两个子节点之间,这也会起作用。
答案 3 :(得分:1)
Dim txt As String
If TypeOf XmlElement.FirstChild Is Xml.XmlText Then
txt = XmlElement.FirstChild.InnerText
End If
答案 4 :(得分:0)
以下示例将为您提供请求文本:
static void Main(string[] args)
{
var document = XDocument.Load("../../TestXmlFile.xml");
if(document.Root == null) return;
var text = ((XText) document.Root.FirstNode).Value;
Console.WriteLine(text);
}