从 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
因此,您需要检查是否可以将其转换为 XDocument
或 XElement
,并使用它们的方法,或使用 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?