XML命名空间在XPath+;中解析文件时遇到问题;JAVA

XML命名空间在XPath+;中解析文件时遇到问题;JAVA,java,xml,parsing,xpath,namespaces,Java,Xml,Parsing,Xpath,Namespaces,我也有一个XML <?xml version="1.0" encoding="UTF-8"?> <QDTM_IN300301QD ITSVersion="XML_1.0" xmlns="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 QDTM_IN300401QD.xsd "> <

我也有一个XML

<?xml version="1.0" encoding="UTF-8"?>
<QDTM_IN300301QD ITSVersion="XML_1.0" xmlns="urn:hl7-org:v3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:hl7-org:v3 QDTM_IN300401QD.xsd ">

    <controlActEvent classCode="CACT" moodCode="EVN">
        <code code="QDTM_TE300401QD">
        </code>
        <statusCode code="Active" />
        <subject contextConductionInd="true" contextControlCode="ON"
            typeCode="SUBJ">
            <registrationEvent classCode="REG" moodCode="EVN">
                <statusCode code="token" />
                <subject contextControlCode="AN" typeCode="SBJ">
                    <testCodeIdentifier classCode="ROL">
                        <playingTestCodeDetails classCode="ENT"
                            determinerCode="INSTANCE">
                            <code code="6399Z" codeSystemName="QTIM" codeSystemVersion="Updated">
                                <originalText><![CDATA[CBC (includes Differential and Platelets)]]></originalText>
                                <translation codeSystemName="DOSCATALOGNAMEHTMLENABLED">
                                    <originalText><![CDATA[CBC (includes Differential and Platelets)]]></originalText>
                                </translation>
                            </code>
                        </playingTestCodeDetails>
                    </testCodeIdentifier>
                </subject>
            </registrationEvent>
        </subject>
    </controlActEvent>
</QDTM_IN300301QD>
我在XML中的名称空间中面临这个问题。当xml包含“xmlns=“urn:hl7 org:v3”时,xpath查询无法获取数据


我需要解析XML并获取数据,而不从XML中删除名称空间部分。这是与xsd相关的问题还是没有获取提到的xsd?

您需要在表达式中包含名称空间,名称空间可以替换为“前缀”,用作完整名称空间uri的查找

String expr="//prefix:QDTM_IN300401QD/controlActEvent/...."
使用名称空间映射进行设置,请查看并

如果xml只包含一个名称空间,那么您也可以尝试在表达式中使用//*:elementname来忽略元素名存在于哪个名称空间中


请看一看,为了了解名称空间是如何使用的以及它们解决了什么问题

您需要在表达式中包含名称空间,名称空间可以替换为“前缀”,用作完整名称空间uri的查找

String expr="//prefix:QDTM_IN300401QD/controlActEvent/...."
使用名称空间映射进行设置,请查看并

如果xml只包含一个名称空间,那么您也可以尝试在表达式中使用//*:elementname来忽略元素名存在于哪个名称空间中


看看如何使用名称空间以及它们解决了什么问题在
NamespaceContext
getNamespaceURI
的目的是将源文档中的每个名称空间与唯一前缀相关联,以便XPath引擎在元素遇到前缀时知道它属于哪个名称空间XPath表达式中的前缀字符串。此处的前缀不需要与源XML中相同URI的前缀(如果有)匹配;它只需要提供从前缀到正确命名空间的映射

那么,如果你要这样写表达式:

//p:QDTM_IN300301QD/p:controlActEvent/p:subject/p:registrationEvent/p:subject
    /p:testCodeIdentifier/p:playingTestCodeDetails/p:code
        /p:translation[@codeSystemName='DOSCATALOGNAMEHTMLENABLED']
            /p:originalText/text()"
public String getNamespaceURI(String prefix) {
    if ("p".equals(prefix)) {
        return "urn:hl7-org:v3";
    } 
    return null;
}
…然后您将编写相应的
getNamespaceURI
,如下所示:

//p:QDTM_IN300301QD/p:controlActEvent/p:subject/p:registrationEvent/p:subject
    /p:testCodeIdentifier/p:playingTestCodeDetails/p:code
        /p:translation[@codeSystemName='DOSCATALOGNAMEHTMLENABLED']
            /p:originalText/text()"
public String getNamespaceURI(String prefix) {
    if ("p".equals(prefix)) {
        return "urn:hl7-org:v3";
    } 
    return null;
}
这就是引擎在遇到
p
前缀时如何知道在
urn:hl7 org:v3
名称空间中查找元素的方法,这就是关键所在。否则,引擎如何知道您不希望在300301qd中有名为
QDTM_的元素?或者在其他名称空间中有名为
QDTM_的元素王牌

请注意,前缀名称是任意的;它可以是您想要的任何名称,只要它是唯一的。也就是说,如果您的文档中有其他名称空间,则需要修改
getNamespaceURI
,以了解这些名称空间,并为每个名称空间分配唯一的前缀

以下是一个完整(最少)的示例:


NamespaceContext
内部的
getNamespaceURI
的目的是将源文档中的每个名称空间与唯一前缀相关联,以便XPath引擎在XPath表达式中遇到前缀字符串时知道元素属于哪个名称空间ix(如果有)用于源XML中的相同URI;它只需要提供从前缀到正确命名空间的映射

那么,如果你要这样写表达式:

//p:QDTM_IN300301QD/p:controlActEvent/p:subject/p:registrationEvent/p:subject
    /p:testCodeIdentifier/p:playingTestCodeDetails/p:code
        /p:translation[@codeSystemName='DOSCATALOGNAMEHTMLENABLED']
            /p:originalText/text()"
public String getNamespaceURI(String prefix) {
    if ("p".equals(prefix)) {
        return "urn:hl7-org:v3";
    } 
    return null;
}
…然后您将编写相应的
getNamespaceURI
,如下所示:

//p:QDTM_IN300301QD/p:controlActEvent/p:subject/p:registrationEvent/p:subject
    /p:testCodeIdentifier/p:playingTestCodeDetails/p:code
        /p:translation[@codeSystemName='DOSCATALOGNAMEHTMLENABLED']
            /p:originalText/text()"
public String getNamespaceURI(String prefix) {
    if ("p".equals(prefix)) {
        return "urn:hl7-org:v3";
    } 
    return null;
}
这就是引擎在遇到
p
前缀时如何知道在
urn:hl7 org:v3
名称空间中查找元素的方法,这就是关键所在。否则,引擎如何知道您不希望在300301qd
中有名为
QDTM_的元素?或者在其他名称空间中有名为
QDTM_的元素王牌

请注意,前缀名称是任意的;它可以是您想要的任何名称,只要它是唯一的。也就是说,如果您的文档中有其他名称空间,则需要修改
getNamespaceURI
,以了解这些名称空间,并为每个名称空间分配唯一的前缀

以下是一个完整(最少)的示例:


如果我错了,请更正“您想在解析XML文档时获取名称空间吗?”“对吗?我需要使用XPath表达式从XML获取数据,而XML中的命名空间正在阻止它以获取数据…”。。。。它为什么这样做。。为了避免这种情况,我删除了XML中的行,并在Java代码中添加了代码。我刚刚对行下部分进行了更改,它对我起到了作用..:domFactory.setNamespaceAware(false);//如果我把某件事情弄到了错误的一边,那么就让它成为真的来纠正我…@GOK-这通常是错误的方向。名称空间很重要。请参阅我的答案。如果我错了,请更正“您希望在解析XML文档时获取名称空间”,对吗?我需要使用XPath表达式从XML获取数据,而XML中的名称空间正在阻止它以获取数据。。。。它为什么这样做。。为了避免这种情况,我删除了XML中的行,并在Java代码中添加了代码。我刚刚对行下部分进行了更改,它对我起到了作用..:domFactory.setNamespaceAware(false);//如果我把某件事情弄到了错误的一边,那么就让它成为真的来纠正我…@GOK-这通常是错误的方向。名称空间很重要。看看我的答案。我不明白这一点;就像它说的那样,我们可以使用来创建自己的名称空间上下文,但我可以有许多表达式,因此对于所有需要创建名称空间上下文并在我的表达式中添加pre:的内容???您需要做的是创建一个名称空间上下文,其中包含对所有可能名称空间的查找。在您的示例中,有一个默认名称空间xmlns=“urn:hl7 org:v3”,还有一个额外的xmlns:xsi,在实际的xml内容中从未使用过。在计算表达式时,它会查找以“:”结尾的任何内容,如果找到任何内容,它将调用getNamespaceURI(字符串前缀)以查找完整的Uri,//pre:QDTM_IN。。。。前缀变量变为“pre”,扩展完整uri并继续求值。默认命名空间隐式地导致