【问题标题】:nodes are return null when trying to read XML document尝试读取 XML 文档时节点返回 null
【发布时间】:2017-12-22 18:32:18
【问题描述】:

我已经以编程方式编写了一个 xml 文档来存储一些数据,当我尝试将其加载回我在不同区域的应用程序中时,我的所有 Xmlnodes 都返回 null,即使我给它的节点名称是相同的。这使我无法提取每个节点的内部文本。

问题: 我错过了什么阻止我阅读这个 xml 文档

代码:

var xmlDocument = new XmlDocument();
xmlDocument.Load(@"\\mi\dfs\shared\Everyone\The Guy Technology\cavanaugh\OutageInformationDocument.xml");

XmlNode title = xmlDocument.SelectSingleNode("TitleTextvariable");
XmlNode type = xmlDocument.SelectSingleNode("TypeTextvaraible");
XmlNode information = xmlDocument.SelectSingleNode("InformationText");
XmlNode conference = xmlDocument.SelectSingleNode("ConferenceText");
XmlNode steps = xmlDocument.SelectSingleNode("StepsText");
XmlNode eta = xmlDocument.SelectSingleNode("EtaText");
XmlNode phone = xmlDocument.SelectSingleNode("PhoneMessageText");
XmlNode banner = xmlDocument.SelectSingleNode("BannerText");

XML 示例:

<OutageInfo>
  <OutageInformation>
    <OutageInfoitems>
      <TitleTextvariable>title text</TitleTextvariable>
      <TypeTextvaraible>info</TypeTextvaraible>
      <InformationText>this is a test of the outage information</InformationText>
      <ConferenceText>information</ConferenceText>
      <StepsText>resolve it in this way</StepsText>
      <EtaText>30 minutes</EtaText>
      <PhoneMessageText>There is currently a phone message up</PhoneMessageText>
      <BannerText>There is not currently a banner posted</BannerText>
    </OutageInfoitems>
  </OutageInformation>
</OutageInfo>

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

    你可以使用XElement:

    var xml = XElement.Load(pathToFile);
    var infoItem = xml.Descendants("OutageInfoitems").First();
    var title = (string)infoItem.Element("TitleTextvariable");
    

    将元素转换为字符串(在最后一行)是更可取的方式,因为如果没有这样的元素,那么title 将是null 而抛出异常

    【讨论】:

      【解决方案2】:

      您正在使用的方法,XmlNode.SelectSingleNode(string xpath)选择与作为参数值传入的 XPath 表达式匹配的第一个 XmlNode。

      因此,您需要使用 XPath 递归下降运算符 // 来下降您的 XML 节点层次结构以挑选出深度嵌套的节点:

      XmlNode title = xmlDocument.SelectSingleNode("//TitleTextvariable");
      XmlNode type = xmlDocument.SelectSingleNode("//TypeTextvaraible");
      XmlNode information = xmlDocument.SelectSingleNode("//InformationText");
      XmlNode conference = xmlDocument.SelectSingleNode("//ConferenceText");
      XmlNode steps = xmlDocument.SelectSingleNode("//StepsText");
      XmlNode eta = xmlDocument.SelectSingleNode("//EtaText");
      XmlNode phone = xmlDocument.SelectSingleNode("//PhoneMessageText");
      XmlNode banner = xmlDocument.SelectSingleNode("//BannerText");      
      

      更多信息见Context for XPath Expressions:

      XPath 表达式的计算取决于表达式所针对的上下文。上下文由计算表达式的节点及其关联环境组成,其中包括以下...

      递归下降

      使用双正斜杠 (//) 的表达式表示可以包含零个或多个层次结构级别的搜索。当此运算符出现在模式的开头时,上下文相对于文档的根。

      工作.Net fiddle

      【讨论】:

      • 这很有意义,但也许我没有完全理解某些东西。如上所示,我实现了递归下降,并成功返回了标题。标题下的所有内容仍然返回 null。每次下一行都需要做 / 吗?
      • @funktail1989 - 需要查看minimal reproducible example 才能发表评论。也许您可以edit 将您的问题包含在内,或者ask another question 并描述您的问题。另请参阅XPath Syntax
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多