从 XNode 中读取值

Posted

技术标签:

【中文标题】从 XNode 中读取值【英文标题】:Reading values from within an XNode 【发布时间】:2011-12-26 00:38:02 【问题描述】:

我有一些代码向我返回一个 XNode,如下所示:

<File>
  <Component>Main</Component>
  <Path>C:\Main\</Path>
  <FileName>main.txt</FileName>
</File>

我需要一些能够提取 Path 值的 C# 代码,例如 (C:\Main)。我知道如果我使用的是 XML 节点,我可以这样做:

String filePath = xmlNode["Path"].InnerText;

有人知道 XNode 的等价物是什么吗?非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

您是否让它返回XNode 而不是XElement?使用XElement 比使用XNode 更简单:

string filePath = fileElement.Element("Path").Value;

这将找到 first Path 元素,如果没有,则会抛出 NullReferenceException。如果您很高兴收到null(如果没有),另一种选择是:

string filePath = (string) fileElement.Element("Path");

如果您真的坚持使用 XNode,您将不得不转换为 XElement 或可能是 XContainer

【讨论】:

尝试转换为 XElement 时出现异常。你有解决方案吗?提前致谢 @ot0:不知道更多上下文,不。我建议你用一个例子提出一个新问题。 XElement xelm = (XElement) XNodeObject;返回异常 @ot0:这不是一个新的例子。这是一个带有单个语句的评论,没有足够的上下文来了解发生了什么。 我会在几分钟后发布一个更具体的问题。【参考方案2】:

您可以将您的 XNode 转换为 XElement 以访问其属性,我的示例:

XNode lastNode = myXElement.LastNode;

//if I want to get the 'ID' attribute
string id = (lastNode as XElement).Attribute("ID").Value;

【讨论】:

向下转型不好吗? 啊,谢谢。不过,我现在看到 XElement 可以正常工作。 以示例 XML 作为 XNode,他不是对节点下的元素而不是属性更感兴趣吗?所以更像 string path = (lastNode as XElement).Element("Path").Value;【参考方案3】:

将 XNode 转换为 XElement 适用于单个元素以检索其值或属性。但是您将无法使用 myXelement.Elements("XXX") 来获取嵌套元素。为此,您可以使用 xmlNode.Nodes()。

这应该可行:

var nodes = xmlNode.Nodes();//Get all nodes under 'File'
var fileNameNode = nodes.Where(el => ((XElement)el).Name.LocalName == "FileName")
.FirstOrDefault();
string filePath = ((XElement)fileNameNode).Value;

【讨论】:

【参考方案4】:

你可以使用这个:

XElement xtr = XElement.Load("path/to/your/xml/file");
String filePath = xtr.Descendants("Path").Single().Value;

【讨论】:

【参考方案5】:

如果您导入 System.Xml.XPath,您可以像这样在 XNode 对象上使用 XPathSelectElement:

String component = xmlNode.XPathSelectElement("Component");
String path = xmlNode.XPathSelectElement("Path");
String fileName = xmlNode.XPathSelectElement("FileName");

【讨论】:

【参考方案6】:

这取决于抽象XNode 是什么具体对象。来自XNode Class:

XNode 是以下类型的抽象公共基类: X评论 XContainer:可以是 XDocument 或 XElement XDocumentType X加工指令 XText

因此,您需要检查是否可以将其转换为 XDocumentXElement,并使用它们的方法,或使用 LINQ to XML:

例如:

Best way to query XDocument with LINQ? Querying an XDocument vs. Querying an XElement (C#)

【讨论】:

【参考方案7】:
XNode xnode 
string value = (xnode  as XElement).Value;

我们可以从 XElement 对象中获取值,所以我们需要先将 XNode 转换为 XElement

应该工作

【讨论】:

虽然这可能会解决问题,但最好也包含解释。 这是一个 7 年以上的问题,答案已被接受,并且此提供的答案被标记为低质量帖子以供审核。以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review。

以上是关于从 XNode 中读取值的主要内容,如果未能解决你的问题,请参考以下文章

为啥 XNode 在 System.XML.Linq 命名空间而不是 System.XML?

Codeigniter 从 Session 读取值或从 URL 参数读取值哪个更快? [关闭]

我必须改变啥才能从数组中读取像素值?

从 Excel 工作表中读取日期时间值

从数据库中读取布尔值?

无法从 excel 列中读取字符串值