代码之家  ›  专栏  ›  技术社区  ›  taygetos blackbot

JAXB用名称空间解包,但不带前缀

  •  0
  • taygetos blackbot  · 技术社区  · 5 年前

    我想用JAXB

    1. 将xml解组为java对象,
    2. 将其封送回xml
    3. 并使用名称空间生成完全相同的输出

    以下是原始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>
    

    我正在使用以下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;
      }
    
    }
    

    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);
    

    但这并没有真正起作用,我甚至无法解组初始xml。但是如果我尝试封送一个POJO,在那里我只在代码中设置字段。我得到以下结果:

    <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>
    

    如何删除这个ns3前缀?

    0 回复  |  直到 5 年前
        1
  •  1
  •   taygetos    5 年前

    我通过在

    package-info.java包

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