XML命名空间在XPath+;中解析文件时遇到问题;JAVA
我也有一个XMLXML命名空间在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 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并继续求值。默认命名空间隐式地导致