c# - 在 XDocument 中递归查找节点

标签 c# xml linq-to-xml

我想我忽略了一些简单的事情,但我很难递归地从 XDocument 中提取节点。

我有类似这样的 XML:

<?xml version="1.0" encoding="iso-8859-1"?>
<content>
  <operation></operation>
  <entry>
    <observation>
      <templateId/>
      <code></code>
      <value></value>
      <entryRelationship>
        <observation>
          <templateId/>
          <code></code>
          <value></value>
        </observation>
      </entryRelationship>
      <entryRelationship>
        <observation>
          <templateId/>
          <code></code>
          <value></value>
        </observation>
      </entryRelationship>
    </observation>
  </entry>
</content>

我以为我可以使用所有三个观察节点

foreach (XElement element in Content.Descendants("observation"))
    ExamineObservation(element);

虽然看起来这只适用于观察没有 child 的情况。我也尝试了 .Ancestors 和 .DecentantNodes,但没有得到我想要的。

我可以轻松地编写一个递归方法来满足我的需要,但如果有的话,我宁愿使用现有的方法,尤其是因为我将在多个项目中大量使用 XML。我是否遗漏了一些明显的东西?

请注意,任何表示观察的节点,我都需要从中获取代码和值,因此在下面的示例中,我将需要处理三个观察节点。观察节点的嵌套和数量是任意的。

感谢您的帮助。

附录

我突然想到,我可能没有提供足够的有关 XML 的信息。我不认为标签会有所作为,但我想我应该包括它们以防万一。下面是我试图解析的实际消息的前几行。为了保护隐私,我确实用“...”替换了一些文本。

<?xml version="1.0" encoding="iso-8859-1"?>
<content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <operation>update</operation>
  <entry xmlns="urn:hl7-org:v3">
    <observation classCode="OBS" moodCode="EVN">
      <templateId root="..." />
      <code code="..." codeSystem="..." codeSystemName="..." displayName="...">
      </code>
      <value xsi:type="..." code="..." codeSystem="..." codeSystemName="..." displayName="...">
      </value>
      <entryRelationship typeCode="...">
        <observation classCode="..." moodCode="...">

最佳答案

我刚刚在 VS2012 中运行这段代码,它命中了 Console.WriteLine() 3 次,正确输出了观察节点和内容:

        XElement content = XElement.Parse(yourXmlStringWithNamespaceHeader);
        foreach (XElement obs in content.Descendants("observation"))
            Console.WriteLine(obs.ToString());

编辑 - 考虑新的命名空间信息,并使用 XDocument 而不是 XElement:

        XNamespace nse = "urn:hl7-org:v3";
        XDocument content = XDocument.Parse(yourXmlStringWithNamespaceHeader);
        foreach (XElement ele in content.Descendants(nse + "observation"))
            Console.WriteLine(ele.ToString());

关于c# - 在 XDocument 中递归查找节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473589/

相关文章:

c# - 将单独的列从 .csv 拉入 c# 中的单独数组

c# - 如何使用 SSL 通过套接字发送 json 消息

java - 为 BacKstack 调用 getChildFragmentManager() 时出现非法状态异常

sql - SQL Server 子节点中的空白 xml 命名空间

c# - 将带名称和不带名称的命名空间添加到 XElement

c# - 如何处理 LINQ to XML 查询中缺失的节点

c# - 在另一个中继器内动态绑定(bind)一个中继器?

c# - Razor Page - 当存储在 html 数据属性中时,C# 代码中带有空格的字符串会被缩短

java - 使用 UTF-8 XML 文件进行 DOM 解析

c# - 删除 xml 节点 -Xelement