我很抱歉,但我想我只是没有看到我在这里犯的错误。 我有一个返回 XML 的骆驼路由,为了能够测试输出,我编写了一个与 SpringRunner 一起运行的 JUnit 测试。在那里,我从交换中获取 XML 流,并根据 XSD 进行验证。这非常有效,因为 XSD 会抛出异常,因为输出 XML 无效,但我不明白为什么以下 xquery 会生成带有 EMPTY NAMESPACE 的元素? 请参阅 xquery 片段(再次抱歉,我无法提供更多代码):
declare default element namespace "http://www.dppgroup.com/XXXPMS";
let $cmmdoc := $doc/*:cmmdoc
, $partner := $doc/*:cmmdoc/*:information/*:partner_gruppe/*:partner
, $sequence:= fn:substring($cmmdoc/@unifier,3)
return <ClientMMS xmlns:infra="http://www.dppgroup.com/InfraNS">
{
for $x in $partner
where $x[@partnerStatusCode = " "]
return
element {"DataGroup" } {
<Client sequenceNumber="{$sequence}" />
}
}
我的问题是,使用此代码生成的 XML 包含具有以下命名空间定义的 DataGroup 元素:
<?xml version="1.0" encoding="UTF-8"?>
<ClientMMS xmlns="http://www.dppgroup.com/XXXPMS"
xmlns:infra="http://www.dppgroup.com/InfraNS">
<DataGroup xmlns="">
<Client sequenceNumber="170908065609671475"/>
</DataGroup>
</ClientMMS>
单元测试中的片段:我正在使用 jdk1.8_102
String xml = TestDataReader.readXML("/input/info/info_in.xml", PROJECT_ENCODING);
quelle.sendBody(xml);
boolean valid = false;
try {
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream((byte[]) archiv.getExchanges().get(1).getIn().getBody());
Document document = documentBuilder.parse(byteArrayInputStream);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(document);
transformer.transform(source, result);
String xmlString = result.getWriter().toString();
System.out.println(xmlString);
在任何 XQuery 介绍/教程/解释中我都找不到发生这种情况的原因。 你们能解释一下为什么 DataGroup 元素不在默认命名空间中吗?
您发布的 XQuery 应该可以很好地创建结果,而无需显示您显示的命名空间未声明。
在 Java 代码中,如果您想使用带有命名空间的 XML,请确保使用命名空间感知的 DocumentBuilder,因为默认的 DocumentBuilderFactory 不感知命名空间,请确保在使用它创建 DocumentBuilder 之前在工厂上设置
setNamespaceAware(true)
。
@Martin,我们可以删除这些