从JAXB的XSD创建XML文件

问题描述:

我在使用JAXB从XSD创建XML文件时遇到问题,下面是用于创建它的XSD文件。 (注:名称已经被编辑过,由于保密)从JAXB的XSD创建XML文件

<?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://ibm.org/seleniumframework" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="Test" type="sel:Test"> 
     <xs:complexType> 
      <xs:choice minOccurs="1" maxOccurs="unbounded"> 
       <xs:element name="Option1" type="sel:Option1Type" xmlns:sel="http://ibm.org/seleniumframework"/> 
       <xs:element name="Option2" type="sel:Option2Type" xmlns:sel="http://ibm.org/seleniumframework"/> 
       <xs:element name="Option3" type="sel:ScreensType" xmlns:sel="http://ibm.org/seleniumframework"/> 
      </xs:choice> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="ScreensType"> 
     <xs:sequence> 
      <xs:element type="sel:ScreenType" name="Screen" minOccurs="1" maxOccurs="unbounded" xmlns:sel="http://ibm.org/seleniumframework"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="ScreenType"> 
     <xs:sequence> 
      <xs:element name="ScreenData" minOccurs="1" maxOccurs="unbounded" xmlns:sel="http://ibm.org/seleniumframework"/> 
     </xs:sequence> 
     <xs:attribute type="xs:string" name="name1" use="required" /> 
     <xs:attribute type="xs:string" name="name2" use="required" /> 
     <xs:attribute type="xs:string" name="name3" use="required" /> 
    </xs:complexType> 

</xs:schema> 

这是我使用的尝试和创建XML代码:

public void generateXml() throws JAXBException, IOException { 

      Test test = new Test(); 
      ScreensType screens = new ScreensType(); 
      ScreenType screen = new ScreenType(); 
      screen.setName1("a"); 
      screen.setName2("b"); 
      screen.setName3("c"); 

      File f = new File("new.xml"); 
      JAXBContext context= JAXBContext.newInstance("com.q1labs.qa.xmlgenerator.model.generatedxmlclasses"); 
      Marshaller jaxbMarshaller = context.createMarshaller(); 
      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

      jaxbMarshaller.marshal(test, f); 
      jaxbMarshaller.marshal(test, System.out); 

     } 

这是输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
     <Test xmlns="http://ibm.org/seleniumframework"/> 

我怎样才能让代码输出屏幕和屏幕标记以及它的属性,我不知道我在做什么错误。

+1

根据你的代码,你几乎不会创建'screen'和'screens'变量,也不会对它们做任何事情。你只是测试。你忘了'test.setOption3(屏幕)'或类似的东西? –

您创建了一个TestScreensType的实例,但在将它们编组为XML之前从未设置它们的任何属性。以下是更正后的代码。

public void generateXml() throws JAXBException, IOException { 
    Test test = new Test(); 
    ScreensType screens = new ScreensType(); 
    test.getOption1OrOption2OrOption3().add(screens); 
    ScreenType screen = new ScreenType(); 
    screen.setName1("a"); 
    screen.setName2("b"); 
    screen.setName3("c"); 
    screens.getScreen().add(screen); 

    File f = new File("new.xml"); 
    JAXBContext context= JAXBContext.newInstance("com.q1labs.qa.xmlgenerator.model.generatedxmlclasses"); 
    Marshaller jaxbMarshaller = context.createMarshaller(); 
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

    jaxbMarshaller.marshal(test, f); 
    jaxbMarshaller.marshal(test, System.out); 
} 

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Test xmlns="http://ibm.org/seleniumframework"> 
    <Option3> 
     <Screen name1="a" name2="b" name3="c"/> 
    </Option3> 
</Test> 
+1

工作正常!非常感谢!我是JAXB的新手,所以你提供了很多帮助。 – Colin747

+1

@ Colin747 - 我很高兴我能帮上忙。顺便说一句,我维护一个Java XML和JSON绑定博客,你可能会觉得有用:http://blog.bdoughan.com/ –

+1

干杯,为书签! – Colin747

尝试了几天后,最终我能创建XSD正确使用下面给出的代码的XML。希望这会有所帮助:

  String filename = "<filepath/filename>"; 

      final Document doc = loadXsdDocument(filename); 

     //Find the docs root element and use it to find the targetNamespace 
      final Element rootElem = doc.getDocumentElement(); 
      String targetNamespace = null; 
      if (rootElem != null && rootElem.getNodeName().equals("xs:schema")) 
         { 
       targetNamespace = rootElem.getAttribute("targetNamespace"); 
      } 


         //Parse the file into an XSModel object 
      XSModel xsModel = new XSParser().parse(filename); 

         //Define defaults for the XML generation 
      XSInstance instance = new XSInstance(); 
      instance.minimumElementsGenerated = 1; 
      instance.maximumElementsGenerated = 1; 
      instance.generateDefaultAttributes = true; 
      instance.generateOptionalAttributes = true; 
      instance.maximumRecursionDepth = 0; 
      instance.generateAllChoices = true; 
      instance.showContentModel = true; 
      instance.generateOptionalElements = true; 

         //Build the sample xml doc 
         //Replace first param to XMLDoc with a file input stream to write to file 
      QName rootElement = new QName(targetNamespace, "<xsd file name>"); 
      XMLDocument sampleXml = new XMLDocument(new StreamResult(System.out), true, 4, null); 
      instance.generate(xsModel, rootElement, sampleXml); 
     } catch (TransformerConfigurationException e) 
       { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static Document loadXsdDocument(String inputName) { 
     final String filename = inputName; 

     final DocumentBuilderFactory factory = DocumentBuilderFactory 
       .newInstance(); 
     factory.setValidating(false); 
     factory.setIgnoringElementContentWhitespace(true); 
     factory.setIgnoringComments(true); 
     Document doc = null; 

     try { 
      final DocumentBuilder builder = factory.newDocumentBuilder(); 
      final File inputFile = new File(filename); 
      doc = builder.parse(inputFile); 
     } catch (final Exception e) { 
      e.printStackTrace(); 
      // throw new ContentLoadException(msg); 
     } 

     return doc; 
    } 
+0

此答案的示例代码使用[JLibs项目](https://santhosh-tekuri.github.io/jlibs/xsd/XSInstance.html)中的类。 –