![](/img/trans.png)
[英]JAXB Provide Empty XML Element as <xmlelement/> And Remove Namespace Name
[英]xquery transformation creates empty namespace in element
对不起,但我想我看不到我在这里犯的错误。 我有一个骆驼路线,该路线返回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-element:
<?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)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.