C# XML获取不带childrens值的标记的值
我正在尝试获取下面C# XML获取不带childrens值的标记的值,c#,xml,xelement,C#,Xml,Xelement,我正在尝试获取下面标记的值(这是一个测试值)。我在Windows窗体应用程序中使用XElement阅读它。但是如果我使用element.Value我也会得到一个包含所有子元素值的字符串。需要读取的最后一个XML文件是生成的XML文件。因此,解决方案必须是动态的。没有固定的名字 element.Value的结果是:这是一个测试值jack22纽约guido21 Hollywoodmichael20 Bostony-Computer-1 XML文件: <?xml version="1.0" en
标记的值(这是一个测试值)。我在Windows窗体应用程序中使用XElement阅读它。但是如果我使用element.Value
我也会得到一个包含所有子元素值的字符串。需要读取的最后一个XML文件是生成的XML文件。因此,解决方案必须是动态的。没有固定的名字
element.Value
的结果是:这是一个测试值jack22纽约guido21 Hollywoodmichael20 Bostony-Computer-1
XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<data name="data_resource" howabout="no">
This is a test value
<persons>
<person>
<name>Jack</name>
<age>22</age>
<pob>New York</pob>
</person>
<person>
<name>Guido</name>
<age>21</age>
<pob>Hollywood</pob>
</person>
<person>
<name surname="Bats">Michael</name>
<age>20</age>
<pob>Boston</pob>
</person>
</persons>
<computers>
<computer>
<name>My-Computer-1</name>
<test>
<test2>
<test3>
<test4 testAttr="This is an attribute" y="68" x="132">
Hatseflatsen!
</test4>
</test3>
</test2>
</test>
</computer>
</computers>
</data>
这是一个测试值
杰克
22
纽约
圭多
21
好莱坞
迈克尔
20
波士顿
My-Computer-1
哈塞弗拉森!
有没有人对此有解决方案,我只得到它自己标签的值,而不是他们所有的孩子的值 使用xpath:
XmlDocument doc = new XmlDocument();
doc.Load(/*The path to your xml*/);
XmlNode root = doc.DocumentElement;
XmlNode node = root.SelectSingleNode("/data");
var v = node.FirstChild; //This contains "This is a test value"
使用xpath:
XmlDocument doc = new XmlDocument();
doc.Load(/*The path to your xml*/);
XmlNode root = doc.DocumentElement;
XmlNode node = root.SelectSingleNode("/data");
var v = node.FirstChild; //This contains "This is a test value"
使用Linq2Xml,尝试以下操作:
string xmlString = //read your XML or load the file using XDocument.Load();
XDocument doc = XDocument.Parse(xmlString);
System.Console.WriteLine(doc.Root.FirstNode);
这在任何情况下都有效,通过使用Linq2Xml将
doc.Root
替换为目标XElement
,尝试以下操作:
string xmlString = //read your XML or load the file using XDocument.Load();
XDocument doc = XDocument.Parse(xmlString);
System.Console.WriteLine(doc.Root.FirstNode);
这在任何情况下都有效,通过将
doc.Root
替换为目标的XElement
,这将立即获得元素中的所有文本,而不会获得其子元素的任何文本:
var textValues = element.Nodes()
.Where(n => n.NodeType == XmlNodeType.Text)
.Select(n => n.ToString().Trim());
string value = string.Join("", textValues); // value is: This is a test value
这将立即获取元素中的所有文本,而不获取其子元素的任何文本:
var textValues = element.Nodes()
.Where(n => n.NodeType == XmlNodeType.Text)
.Select(n => n.ToString().Trim());
string value = string.Join("", textValues); // value is: This is a test value
你到底想做什么?您可以迭代所有*数据元素,并使用root.elements(“数据”)而不是Value逐个获取它们的值。是的,但正如我所提到的:我使用生成的XML文件,所以我不知道需要选择数据。这就是一个例子。我只需要获取数据标签的值(不知道它是数据)。我会遍历所有项目,这就是我使用element.Value的原因。但孩子们的所有价值观都被添加到了这一点上。我想要一个解决方案。
XElement
和XNode
之间有区别。简单来说,节点>标记。每个元素都是一个节点,但不是每个节点都是一个标记。您到底想做什么?您可以迭代所有*数据元素,并使用root.elements(“数据”)而不是Value逐个获取它们的值。是的,但正如我所提到的:我使用生成的XML文件,所以我不知道需要选择数据。这就是一个例子。我只需要获取数据标签的值(不知道它是数据)。我会遍历所有项目,这就是我使用element.Value的原因。但孩子们的所有价值观都被添加到了这一点上。我想要一个解决方案。XElement
和XNode
之间有区别。简单来说,节点>标记。每个元素都是一个节点,但不是每个节点都是一个标记。不需要第四行root
将已经位于data
元素,您可以直接使用它。但是,这并不假设所需的文本是元素的第一个子节点。第四行是不必要的root
将已经位于data
元素,您可以直接使用它。但是,这确实假设所需的文本是元素的第一个子节点。这正是我所寻找的!非常感谢。正是我要找的!非常感谢。