xquery转换在元素中创建空命名空间

时间:2017-10-03 09:41:52

标签: java xml namespaces xquery

对不起,我猜我只是没有看到我在这里犯的错误。 我有一个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元素不在默认命名空间中吗?

1 个答案:

答案 0 :(得分:1)

您发布的XQuery应该可以很好地创建结果,而不会显示您未显示的命名空间。

在Java代码中,如果要使用带命名空间的XML,请确保使用名称空间感知的DocumentBuilder,因为默认的DocumentBuilderFactory不支持名称空间,请确保在创建带有DocumentBuilder的工厂之前设置setNamespaceAware(true)