【问题标题】:XML get value of tag without childrens valueXML获取没有子值的标签值
【发布时间】:2013-11-12 08:55:31
【问题描述】:

我正在尝试获取下面<data> 标记的值(这是一个测试值)。我在 Windows 窗体应用程序中使用 XElement 阅读它。但是如果我使用element.Value,我也会得到一个包含所有孩子值的字符串。最终需要读取的 XML 文件是生成的 XML 文件。所以解决方案需要是动态的。没有固定的名字。

element.Value 的结果是:This is a test value Jack22New YorkGuido21HollywoodMichael20BostonMy-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>

有没有人对此有修复或解决方案,我只得到它自己标签的价值,而不是他们所有的孩子?

【问题讨论】:

  • 你到底想做什么?您可以遍历所有 *data 元素并使用 root.Elements("data") 而不是 Value. 逐个获取它们的值
  • 是的,但正如我提到的:我使用的是生成的 XML 文件,所以我不知道我需要选择数据。那是一个例子。我只需要获取数据标签的值(不知道它是数据)。我确实遍历了所有项目,这就是我使用 element.Value 的原因。但是孩子们的所有价值观都会被添加到其中。我想要一个解决方案。
  • XElementXNode 之间存在差异。简单来说,节点>标签。每个元素都是一个节点,但不是每个节点都是一个标签。

标签: c# xml xelement


【解决方案1】:

这会立即获得元素内的所有文本,而不是其后代的文本:

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

【讨论】:

  • 正是我想要的!谢谢!
【解决方案2】:

使用 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"

【讨论】:

  • 你的第四行是不必要的。 root 已经定位在 data 元素上,您可以使用它。但是,这确实假定所需的文本是元素的第一个子节点。
【解决方案3】:

使用 Linq2Xml,试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多