【问题标题】:How to read a node in a serialized XML file?如何读取序列化 XML 文件中的节点?
【发布时间】:2019-12-29 15:33:50
【问题描述】:

我正在尝试读取序列化 XML 文件中的节点。这是 XML 文件的第一部分(我使用的是屏幕截图,因为粘贴的格式很奇怪):

这是我用来读取 XML 的代码及其引发的错误:

我正在尝试读取 <ScenarioDescription> 节点。

根据要求,这是整个 XML 文件。不幸的是,这只是一团糟。这是link to the XML file

【问题讨论】:

  • 您可能必须在查询中使用节点的命名空间。我对XDocumentXmlDocument 更熟悉,但我认为它们在命名空间方面表现相同。
  • 如果您可以将 xml 和代码发布为内联而不是图像,那就太好了
  • 添加了指向 XML 文件的链接。内联粘贴结果一团糟。
  • 你的问题用词有点矛盾。节点仅存在于 XML 的树表示中,而不是它的序列化表示中。但是,您的代码正在查看树表示...

标签: c# xml serialization


【解决方案1】:

您应该指定命名空间。在这种特殊情况下,默认命名空间用于声明http://schemas.datacontract.org/2004/07/ModelLib 命名空间。

var xml = new XmlDocument();
xml.LoadXml(str);
XmlNamespaceManager ns = new XmlNamespaceManager(xml.NameTable);
ns.AddNamespace("x", xml.DocumentElement.NamespaceURI);
var root = xml.DocumentElement;
var test = root.SelectSingleNode("//x:ScenarioDescription",ns);
var scenarioText = test.InnerText;

【讨论】:

    【解决方案2】:

    您可以使用以下代码访问ScenarioDescription 节点及其InnerText

    var document = new XmlDocument();
    document.Load(s);
    
    var root = document.DocumentElement;
    var node = root["ScenarioDescription"];
    var text = node?.InnerText;
    

    SelectSingleNode 接受 xpath 表达式,您只需使用 XmlElement indexer 代替。否则,您需要创建一个 XmlNamespaceManager 实例并将您的根命名空间添加到其中

    您可以将XmlNamespaceManager 对象作为参数提供给 XmlDocument 类的 SelectNodesSelectSingleNode 方法 执行引用命名空间限定的 XPath 查询表达式 元素和属性名称

    【讨论】:

    • 谢谢!这很有魅力!正是我需要的!非常感谢!
    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多