简体   繁体   English

JAXB解组与命名空间,但没有前缀

[英]JAXB unmarshaling with namespaces, but without prefix

I want to use JAXB to 我想使用JAXB

  1. unmarshal an xml into a java object, 将xml解组为java对象,
  2. marshal it back to an xml 将它编组回xml
  3. and produce the exact same output with namespaces 并使用命名空间生成完全相同的输出

Here is the original XML: 这是原始的XML:

<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com">
    <dataList>
        <data xsi:type="keyValuePair">
            <key>key1</key>
            <value>val1</value>
        </data>
        <data xsi:type="keyValuePair">
            <key>key2</key>
            <value>val2</value>
        </data>
    </dataList>
    <id>123</id>
</customer>

I am using the following POJOs: 我使用以下POJO:

@XmlRootElement(namespace = "http://example.com")
public class Customer {

  private String id;
  private List<KeyValueData> data;

  public Customer(){}

  @XmlElement
  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  @XmlElement
  @XmlElementWrapper(name="dataList")
  public List<KeyValueData> getData() {
    return data;
  }

  public void setData(List<KeyValueData> data) {
    this.data = data;
  }
}

public class KeyValueData {

  private String type;
  private String key;
  private String value;

  public KeyValueData(){}

  @XmlElement
  public String getKey() {
    return key;
  }

  public void setKey(String key) {
    this.key = key;
  }

  @XmlElement
  public String getValue() {
    return value;
  }

  public void setValue(String value) {
    this.value = value;
  }

  @XmlAttribute(namespace = "http://www.w3.org/2001/XMLSchema-instance" )
  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }

}

The code i am using for un/marshalling: 我用于un / marshalling的代码:

InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
JAXBContext context = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Customer customer = (Customer) unmarshaller.unmarshal(inputStream);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(customer, System.out);

And this is not really working, i cannot even unmarshal the initial xml. 这不是真的有效,我甚至无法解组初始的xml。 But if i try just marshaling a POJO where i just set the fields in the code. 但是,如果我尝试只编组一个POJO,我只需在代码中设置字段。 I get the following result: 我得到以下结果:

<ns3:customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns3="http://example.com">
  <dataList>
    <data xsi:type="keyValuePair">
      <key>key1</key>
      <value>val1</value>
    </data>
    <data xsi:type="keyValuePair">
      <key>key2</key>
      <value>val2</value>
    </data>
  </dataList>
  <id>123</id>
</ns3:customer>

How do i get rid of this ns3 prefix? 我如何摆脱这个ns3前缀?

I found a solution by adding the namespace definition in the package level in a 我通过在包中添加命名空间定义来找到解决方案

package-info.java package-info.java

@XmlSchema(namespace = "http://example.com", elementFormDefault = XmlNsForm.QUALIFIED)
package com.example;

(And remove it from the @XMLRootElement) (并从@XMLRootElement中删除它)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM