【问题标题】:How can search node search by tag element如何通过标签元素搜索节点搜索
【发布时间】:2016-02-18 08:33:00
【问题描述】:

我有一个复杂的 XML 文件,我应该用 C# 语言对其进行解析。

所以这是其中的一个简单部分:

<ClinicalDocument>
    <component>
    <section>
        <templateId root='2.16.840.1.113883.10.20.1.11'/> <!-- Problem section template -->
        <code code="11450-4" codeSystem="2.16.840.1.113883.6.1"/> 
        <title>Problems</title> 
        <text></text>
         .......
    </section>
    </component>
</ClinicalDocument>

现在我想搜索这个 XML 文件中 templateId root="2.x.x.x" 的所有元素。

我已构建此代码但无法正常工作:

var doc = XDocument.Load(_xmlName);
            XElement element =
            doc.Element("section")
                .Descendants("templateId")
                .Where(a => a.Element("root").Value.Equals(_TEMPLATE_ID_PROBLEM))
                    .First();

编辑

我已经用这个更改了我的代码:

var doc = XDocument.Load(_xmlName);
            XElement element =
            doc.Element("ClinicalDocument").Element("component").Element("section")
                .Descendants("templateId")
                .Where(a => a.Element("root").Value.Equals(_TEMPLATE_ID_PROBLEM))
                    .First();

但我有一个错误:

System.NullReferenceException was unhandled
  _HResult=-2147467261
  _message=Riferimento a un oggetto non impostato su un'istanza di oggetto.
  HResult=-2147467261
  IsTransient=false
  Message=Riferimento a un oggetto non impostato su un'istanza di oggetto.
  Source=XmlParser_Decipher
  StackTrace:
       in XmlParser_Decipher.Program.Main(String[] args) in c:\Users\michele.castriotta\Source\Workspaces\Omniacare\XmlParser_Decipher\XmlParser_Decipher\Program.cs:riga 19
       in System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       in System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       in Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       in System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       in System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       in System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       in System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       in System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

我已经尝试过这样做:

XElement element =
            doc.Element("ClinicalDocument");

并且 var 元素为空。

【问题讨论】:

  • “但不起作用”并没有告诉我们与预期相比实际发生了什么。请出示minimal reproducible example
  • (我注意到doc.Element("section") 不起作用,因为那不是根元素,请注意...

标签: c# xml parsing linq-to-xml


【解决方案1】:

section 是文档根目录的子节点:

doc.Root.Element("section")

root 也不是元素 - 它是 templateId 元素的属性:

.Where(t => (string)t.Attribute("root") == _TEMPLATE_ID_PROBLEM)

完整的查询看起来像

doc.Root.Element("section")
   .Descendants("templateId") // you can use Elements here
   .Where(t => (string)t.Attribute("root") == _TEMPLATE_ID_PROBLEM)
   .First();

另一个选择是使用 XPath:

doc.Root.XPathSelectElement($"section/templateId[@root='{_TEMPLATE_ID_PROBLEM}']");

【讨论】:

    猜你喜欢
    • 2019-09-18
    • 1970-01-01
    • 2015-10-17
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多