gpt4 book ai didi

java - 用于不带命名空间的子树的 XmlstreamWriter 和 Jaxb

转载 作者:行者123 更新时间:2023-12-01 09:36:42 28 4
gpt4 key购买 nike

我正在结合使用 xmlstreamwriter 和 jaxb 来编码一个大的 xml 文件。我正在使用 jaxb 创建子树,但问题是当我编码子树时,它以默认命名空间为前缀,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<MessageModel xmlns="urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19">
<MessageHeader xmlns="" xmlns:ns2="urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19">
<ns2:ProviderID>5922</ns2:ProviderID>
<ns2:EffectiveDT>2016-08-08-04:00</ns2:EffectiveDT>
<ns2:PartyCount>0</ns2:PartyCount>
<ns2:ArrangementCount>1</ns2:ArrangementCount>
<ns2:AppMetaDataString>ter</ns2:AppMetaDataString>
</MessageHeader>
</MessageModel>

我使用以下代码进行编码(marshal):

        StringWriter result = new StringWriter();
MessageHeaderType messageHeaderType = createMessageHeader(objectFactory);
JAXBElement<MessageHeaderType> element = new JAXBElement<MessageHeaderType>(new QName("MessageHeader"), MessageHeaderType.class, messageHeaderType);

XMLStreamWriter xmlOut = XMLOutputFactory.newFactory().createXMLStreamWriter(result);
**//Setting default namespace**
xmlOut.setDefaultNamespace("urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19");
xmlOut.writeStartDocument();
xmlOut.writeStartElement("urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19", "MessageModel");
xmlOut.writeNamespace("", "urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19");

JAXBContext context = JAXBContext.newInstance(MessageHeaderType.class);
Marshaller marshaller = context.createMarshaller();
//marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.marshal(element, xmlOut);


xmlOut.writeEndDocument();
xmlOut.close();
System.out.println(result.toString());

我正在设置默认命名空间,但它仍然创建带有命名空间的子树。我该怎么做才能使用 jaxb 但没有命名空间生成子树?

最佳答案

你使用QName的方式不正确,我第一次使用的时候也遇到过类似的问题。

当您简单地给出 localName(一个字符串构造函数)时,它假定 namespace 为空。这就是为什么 MessageHeader 有一个标签 xmlns=""。了解更多相关信息 here .

您应该使用的构造函数是 this .

将您当前的 QName 替换为这个 QName,它应该可以工作:

new QName("urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19", "MessageHeader");

而且,你不需要

xmlOut.writeNamespace("", "urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19");

它与默认命名空间是一样的。

关于java - 用于不带命名空间的子树的 XmlstreamWriter 和 Jaxb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38837230/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com