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
元素,您可以直接使用它。但是,这确实假设所需的文本是元素的第一个子节点。这正是我所寻找的!非常感谢。正是我要找的!非常感谢。