【问题标题】:Reading values from within an XNode从 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 的等价物是什么吗?非常感谢任何帮助!

【问题讨论】:

    标签: c# xml linq


    【解决方案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:

          例如:

          【讨论】:

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

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

            应该工作

            【讨论】:

            • 虽然这可能会解决问题,但最好也包含解释。
            • 这是一个 7 年以上的问题,答案已被接受,并且此提供的答案被标记为低质量帖子以供审核。以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review
            猜你喜欢
            • 2012-01-17
            • 1970-01-01
            • 2021-04-11
            • 2018-12-02
            • 2013-09-24
            • 1970-01-01
            • 1970-01-01
            • 2021-10-26
            • 2020-11-30
            相关资源
            最近更新 更多