删除 XML 命名空间,同时忽略根中的命名空间

Posted

技术标签:

【中文标题】删除 XML 命名空间,同时忽略根中的命名空间【英文标题】:Deleting XML namespace while ignoring the one at the root 【发布时间】:2016-12-18 09:30:13 【问题描述】:

我有一个 xml。

<ClinicalDocuments>

<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:voc="urn:hl7-org:v3/voc"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:axolotl="urn:axolotl-com:pdo">
        <realmCode xmlns="" code="US"/>
        <typeId xmlns="" extension="POCD_HD000040" root="2.16.840.1.113883.1.3"/>
        <templateId xmlns="" root="1.3.6.1.4.1.19376.1.5.3.1"/>
        <templateId xmlns="" root="1.3.6.1.4.1.19376.1.5.3.1.1"/>
        <templateId xmlns="" root="1.3.6.1.4.1.19376.1.5.3.1.1.1"/>
        <templateId xmlns="" root="2.16.840.1.113883.10.20.3"/>
        <templateId xmlns="" root="2.16.840.1.113883.10.20.1"/>
        <templateId xmlns="" root="2.16.840.1.113883.3.88.11.32.1"/>
        <id xmlns="" root="006e50e9-29b5-4ab2-8c0b-202819b39646"/>
blah
blah
</ClinicalDocument>
<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:voc="urn:hl7-org:v3/voc"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
blah
blah
.
.
</ClinicalDocument>

</ClinicalDocuments>

xmlns="" 正在覆盖主要的 xmlns。

我想删除 xmlns="" 上的所有其他实例,同时将其保留在根节点 "ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:voc="urn:hl7-org:v3/voc " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:axolotl="urn:axolotl-com:pdo"

整个xml中还有很多其他的xmlns=""。 请帮忙。

【问题讨论】:

您的问题不清楚。首先,ClinicalDocument 不是根节点。接下来,它的孩子在无命名空间中,需要xmlns="" decalration 来明确这一点。您想将它们移动到其父名称空间吗?这将有效地改变您的 XML 架构,因此在您这样做之前请仔细考虑后果。 【参考方案1】:

您不能直接在 XSLT 中操作名称空间声明。您应该确保结果树中的每个元素都位于正确的命名空间中,然后会自动处理命名空间声明。

例如,如果您不希望xmlns="" 出现在realmCode 元素上,那么您应该确保在与其父元素相同的命名空间中生成realmCode 元素。这可以通过模板规则来完成,例如:

<xsl:template match="realmCode">
  <xsl:element name="local-name()" namespace="urn:hl7-org:v3">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

【讨论】:

非常感谢您的回复。但我想使用与其父级相同的命名空间。那么有没有办法将 xmlns="" 变成 xmlns="urn:hl7-org:v3" ? 你好像根本没听懂我的回答。不再担心命名空间声明。只需在所需的命名空间中创建元素,命名空间声明就会自行处理。【参考方案2】:

只需删除xmlns="" 的所有实例。此 XML 通过验证,来自&lt;ClinicalDocument&gt;xmlns 将不再被覆盖:

<ClinicalDocuments>
    <ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:voc="urn:hl7-org:v3/voc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:axolotl="urn:axolotl-com:pdo">
        <realmCode code="US"/>
        <typeId extension="POCD_HD000040" root="2.16.840.1.113883.1.3"/>
        <templateId root="1.3.6.1.4.1.19376.1.5.3.1"/>
        <templateId root="1.3.6.1.4.1.19376.1.5.3.1.1"/>
        <templateId root="1.3.6.1.4.1.19376.1.5.3.1.1.1"/>
        <templateId root="2.16.840.1.113883.10.20.3"/>
        <templateId root="2.16.840.1.113883.10.20.1"/>
        <templateId root="2.16.840.1.113883.3.88.11.32.1"/>
        <id root="006e50e9-29b5-4ab2-8c0b-202819b39646"/>
blah
blah
    </ClinicalDocument>
    <ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:voc="urn:hl7-org:v3/voc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
blah
blah...
    </ClinicalDocument>
</ClinicalDocuments>

【讨论】:

但是我将有大约 80,000 个这些 xml 的传入流。所以我们不能考虑手动删除。有没有办法至少将 xmlns="" 变成 xmlns="urn:hl7-org:v3"?

以上是关于删除 XML 命名空间,同时忽略根中的命名空间的主要内容,如果未能解决你的问题,请参考以下文章

将 xml 数据序列化为 json 时忽略命名空间属性

SAXON 忽略源 XML 中的命名空间 [重复]

JAXB:如何在解组 XML 文档期间忽略命名空间?

python对于操作xml 忽略命名空间 处理解析修改xml

python对于操作xml 忽略命名空间 处理解析修改xml

python对于操作xml 忽略命名空间 处理解析修改xml