xml-parsing - 无法使用 tcl 和 tdom 解析具有多个名称空间的 XML
问题描述
我正在尝试使用 tcl 和 tdom 包解析 XML。我在执行此操作时遇到了麻烦,因为我要解析的节点是具有多个命名空间的节点的子节点。我将如何解析 realmCode 或 title 元素?以下是我尝试过的:
package require tdom
set XML {<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://www.cerner.com/cda_stylesheet/" ?>
<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sdtc="urn:hl7-org:sdtc" xsi:schemaLocation="urn:hl7-org:v3 ../../../CDA%20R2/cda-schemas-and-samples/infrastructure/cda/CDA.xsd" classCode="DOCCLIN" moodCode="EVN">
<realmCode code="US" />
<title>Discharge Summary</title>
</ClinicalDocument>}
set nsmap {
a urn:hl7-org:v3
x http://www.w3.org/2001/XMLSchema-instance
s urn:hl7-org:sdtc
}
set doc [dom parse $XML]
set root [$doc documentElement]
set node [$root selectNodes -namespaces $nsmap "/a:ClinicalDocument/title"]
#set node [$root selectNodes "/ClinicalDocument/title"] ;# tried this as well - does not work
$doc delete
解决方案
您需要为路径的每一级指定命名空间,而不仅仅是根。利用
set title [$root selectNodes -namespaces $nsmap /a:ClinicalDocument/a:title]
set realm [$root selectNodes -namespaces $nsmap /a:ClinicalDocument/a:realmCode/@code]
等等
推荐阅读
- apache-kafka - 覆盖 Kafka MirrorMaker2 中的默认属性
- java - 当在声明中指定属性值更简单时,为什么还要在构造函数中指定属性值?
- r - 返回两个或多个最大相等值
- r - 在语音引号内调用本地人
- c# - 无法访问内存缓存 - ASP.NET Core
- kotlin - 即使我不使用模式生成,我是否应该在 Jetbrain 的 Exposed 上定义约束?
- bash - 从函数的输出创建 Bash 关联数组:为什么“declare -A foo=$(bar)”有效,但“declare -A foo; foo=$(bar)”无效?
- kotlin - 乐观锁定:不支持的版本类型长
- intellij-idea - IntelliJ Idea - 转到文件 > 为什么必须按 Ctrl+Enter 才能打开找到的文件?
- jsp - 如何使用零填充和区域设置小数分隔符格式化此数字?