java中的XSD to XML解析错误

时间:2017-06-02 06:26:22

标签: java xml xsd

我正在尝试使用一些库将XSD文件转换为XML文件。我在coderanch上看到了这段代码并想到了尝试。我在代码中遇到了一些解析错误。

这是代码: -

package csvconverter;

import java.io.File;
import java.io.StringReader;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.stream.StreamResult;

import org.apache.ws.jaxme.xs.XSParser;
import org.apache.xerces.impl.xs.psvi.XSModel;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import jlibs.xml.sax.XMLDocument;
import jlibs.xml.xsd.XSInstance;

public interface xsdtoxml {
     public static void main(String[] pArgs) {
            try {
                String filename = "out.xsd";
                // instance.

                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
                org.apache.xerces.xs.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, "out");
                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;
        }

}

我在这一行遇到问题 -

org.apache.xerces.xs.XSModel xsModel = new XSParser().parse(filename);

当我将String更改为InputSource时,它不接受。 请指出代码中缺少的内容。

这是我得到的异常错误: -

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method parse(InputSource) in the type XSParser is not applicable for the arguments (String)

    at csvconverter.xsdtoxml.main(xsdtoxml.java:40)

2 个答案:

答案 0 :(得分:1)

从jlibs库获取xsparser将解决问题

org.apache.xerces.xs.XSModel xsModel = new jlibs.xml.xsd.XSParser().parse("po.xsd");

答案 1 :(得分:0)

您需要使用jlibs.xml.xsd.XSParser而不是org.apache.ws.jaxme.xs.XSParser

for jlibs.xml.xsd.XSParser you can add below maven dependencies:


<dependency>
    <groupId>in.jlibs</groupId>
    <artifactId>jlibs-xsd</artifactId>
    <version>2.1</version>
</dependency>

Please find corrected and running code below.

    import java.io.File;
    import javax.xml.namespace.QName;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.stream.StreamResult;

    import org.w3c.dom.Document;
    import org.w3c.dom.Element;

    import jlibs.xml.sax.XMLDocument;
    import jlibs.xml.xsd.XSInstance;
    import jlibs.xml.xsd.XSParser;

    public interface xsdtoxml {
         public static void main(String[] pArgs) {
                try {
                    String filename = "out.xsd";
                    // instance.

                    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
                    org.apache.xerces.xs.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, "out");
                    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;
            }

    }