【问题标题】:Jaxb generated xml - problem with root element prefixJaxb 生成的 xml - 根元素前缀问题
【发布时间】:2011-05-17 18:55:25
【问题描述】:

我正在尝试使用 jaxb 生成 xml。我创建了 xsd 并生成了 java 类。 但是当我生成 xml 时,我会在根标签上添加前缀 ns2,这是我不想要的。

ex: 我希望根标签是

 <report>
   <id>rep 1</id>
</report>

,但得到 ​​p>

<ns2:report>
....
</ns2:report>

在生成的java类中,我给注解为@XmlRootElement(name="report",namespace="urn:report")

有人可以帮忙

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    博客条目Customizing JAXB 显示了通过实现PreferredMapper 提供的替代方案。不幸的是,它解释说,完全禁止命名空间是不可能的。

    【讨论】:

    • 谢谢。有用。但是首选映射器会更改前缀,不会删除前缀。在页面底部,他们说不可能删除前缀。我正在尝试解决方法。
    【解决方案2】:

    看看this answer。它描述了如何使用 SAX 过滤器来删除任何命名空间。

    【讨论】:

      【解决方案3】:

      如果这是你的班级:

      package example;
      
      import javax.xml.bind.annotation.XmlRootElement;
      
      @XmlRootElement(name="report",namespace="urn:report")
      public class Root {
      
          private String id;
      
          public String getId() {
              return id;
          }
      
          public void setId(String id) {
              this.id = id;
          }
      
      }
      

      那么在根元素上有一个前缀是有意义的,因为您已经指定“根”元素是命名空间限定的,而“id”元素不是。

      <ns2:report xmlns:ns2="urn:report">
          <id>123</id>
      </ns2:report>
      

      如果你在你的模型中添加一个包信息类,你可以利用@XmlSchema注解:

      @XmlSchema(
              namespace = "urn:report",
              elementFormDefault = XmlNsForm.QUALIFIED)
      package example;
      
      import javax.xml.bind.annotation.XmlNsForm;
      import javax.xml.bind.annotation.XmlSchema;
      

      然后 JAXB 实现可能会选择利用默认命名空间,但请注意现在所有元素都是命名空间限定的,它们可能与您的 XML 模式匹配也可能不匹配:

      <report xmlns="urn:report">
          <id>123</id>
      </report>
      

      有关 JAXB 和命名空间的更多信息,请参阅:

      【讨论】:

      • 如果对象中有两个命名空间,则变成&lt;Message xmlns:ns2="http://404story.com/Code" xmlns="http://404story.com/Order"&gt;,那么一部分会使用&lt;ns2:xxx。你能告诉我如何删除ns2 前缀吗?
      • @navins - 你能把这个作为一个新问题发布吗?
      【解决方案4】:

      在架构的根元素中使用此属性:elementFormDefault="qualified" 比如:

      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
      

      【讨论】:

        【解决方案5】:

        不知何故,接受的答案对我不起作用。当我在涉及来自 cxf 的 DelegatingXMLStreamWriter 和过滤器 NoNamesWriter 的一些相关 stockOverflow 问题中找到解决方案时,我获得了成功。我与 NoNamesWriter 一起使用的实现:

        public class NoNamesWriter extends DelegatingXMLStreamWriter 
        {
            @Override
            public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
                delegate.writeStartElement("", local, uri);
            }   
        
            public static XMLStreamWriter filter(FileOutputStream fileOutputStream) throws XMLStreamException {
                return new NoNamesWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(fileOutputStream));
            }
        
            public NoNamesWriter(XMLStreamWriter writer) {
                super(writer);
            }
        
        }
        

        调用与here 中描述的相同,例如:

        xmlmarshaller.marshal(xc, NoNamesWriter.filter(new FileOutputStream(outfile, false));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-27
          • 1970-01-01
          • 1970-01-01
          • 2021-08-23
          • 1970-01-01
          相关资源
          最近更新 更多