对不起,我猜我只是没有看到我在这里犯的错误。 我有一个camel路由,它返回一个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>
Unit-Test的片段:我正在使用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元素不在默认命名空间中吗?
答案 0 :(得分:1)
您发布的XQuery应该可以很好地创建结果,而不会显示您未显示的命名空间。
在Java代码中,如果要使用带命名空间的XML,请确保使用名称空间感知的DocumentBuilder,因为默认的DocumentBuilderFactory不支持名称空间,请确保在创建带有DocumentBuilder的工厂之前设置setNamespaceAware(true)
它