【问题标题】:Java: Marshalling Object -- Removing extra ns2 annotation in xmlJava: Marshalling Object -- 移除 xml 中额外的 ns2 注释
【发布时间】:2011-10-24 07:00:12
【问题描述】:

我正在尝试根据定义的架构将对象内的数据编组到 xml 文件中。但是,当我打印出 xml 文件时,我会在 xml 标签上收到额外的注释。有没有办法摆脱额外的命名空间注释(即ns2)

这是我从编组收到的 xml 示例。

<?xml version="1.0" encoding="UTF-8" standalone="yes">
<root xmlns:ns2="http://www.something.com/something">
    <ns2:food>steak</ns2:food>
    <ns2:beverage>water</ns2:beverage>
</root>

我想要的是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes">
<root xmlns="http://www.something.com/something">
    <food>steak</food>
    <beverage>water</beverage>
</root>

这就是我的 Java 代码正在做的事情:

            JAXBContext context = JAXBContext.newInstance("com.schema");
            JAXBElement<FoodSchema> element = new JAXBElement<FoodSchema>
                (new QName("FoodSchema"), Food.class, foodSchema);
            Marshaller marshaller = context.createMarshaller();
            OutputStream os = new FileOutputStream(object.getFilePath());
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
            marshaller.marshal(element, os);

非常感谢任何帮助!谢谢!

【问题讨论】:

标签: java xml jaxb marshalling xml-namespaces


【解决方案1】:

添加到 xsd 架构定义 elementFormDefaultattributeFormDefault

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

【讨论】:

    【解决方案2】:

    感谢您的回答。只是为了给出示例代码 之前:

     marshaller.marshal(new  JAXBElement(new QName(**""**,"Document"),Document.class,swiftDoc), sw);
    

    之后:

    marshaller.marshal(new  JAXBElement(new QName(**"http://www.w3.org/2001/XMLSchema**","Document"),Document.class,swiftDoc), sw);
    

    额外的“ns:”被移除了。

    【讨论】:

      【解决方案3】:

      通过将命名空间 URI(“http://www.something.com/something”)添加到用于构造 JAXB 元素的 QName,并利用包级别的 @XmlSchema 注释将获得命名空间资格您正在寻找的:

      包裹信息

      @XmlSchema(
          namespace="http://www.something.com/something", 
          elementFormDefault=XmlNsForm.QUALIFIED)
      package forum7014746;
      
      import javax.xml.bind.annotation.*;
      

      食物

      package forum7014746;
      
      import javax.xml.bind.annotation.XmlRootElement;
      
      @XmlRootElement
      public class Food {
      
          private String food;
          private String beverage;
      
          public String getFood() {
              return food;
          }
      
          public void setFood(String food) {
              this.food = food;
          }
      
          public String getBeverage() {
              return beverage;
          }
      
          public void setBeverage(String beverage) {
              this.beverage = beverage;
          }
      
      }
      

      演示

      package forum7014746;
      
      import javax.xml.bind.JAXBContext;
      import javax.xml.bind.JAXBElement;
      import javax.xml.bind.Marshaller;
      import javax.xml.namespace.QName;
      
      public class Demo {
      
          public static void main(String[] args) throws Exception {
              JAXBContext jaxbContext = JAXBContext.newInstance(Food.class);
      
              Food foodSchema = new Food();
              foodSchema.setFood("steak");
              foodSchema.setBeverage("water");
      
              JAXBElement<Food> element = new JAXBElement<Food> (new QName("http://www.something.com/something","FoodSchema"), Food.class, foodSchema);
      
              Marshaller marshaller = jaxbContext.createMarshaller();
              marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
              marshaller.marshal(element, System.out);
          }
      
      }
      

      输出

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <FoodSchema xmlns="http://www.something.com/something">
          <beverage>water</beverage>
          <food>steak</food>
      </FoodSchema>
      

      【讨论】:

      • 完美!我不必添加包信息注释标记即可使其工作。在 QName 中添加额外的模式命名空间位置就足够了。再次感谢!
      • 这对我有帮助,我发送的 URI 与架构中定义的不同,导致 resultXMLstring 有另一个命名空间
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2012-09-17
      • 2010-09-28
      • 2023-02-01
      • 1970-01-01
      相关资源
      最近更新 更多