簡體   English   中英

org.xml.sax.SAXParseException 文檔中根元素之后的標記必須格式正確

[英]org.xml.sax.SAXParseException The markup in the document following the root element must be well-formed

我知道那里有一些類似的線程,但它們對我沒有任何幫助,我正在嘗試通過 Java 創建 XML 文件,但我在這一行經常看到這個錯誤doc = db.parse(is); ,有人可以告訴我我哪里出錯了嗎? 錯誤:-

Severe:   [Fatal Error] :2:2: The markup in the document following the root element must be well-formed.
Severe:   org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 2; The markup in the document following the root element must be well-formed.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:348)
at com.digivote.digivote.XmlServlet.doPost(XmlServlet.java:194)

我的代碼:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html");        
    String level = request.getParameter("level");
    String add = request.getParameter("add");
    String addCat = request.getParameter("addCat");
    String addQuestions = request.getParameter("addQuestion");
    String add_multiChoice = request.getParameter("add_multiChoice");

    try 
    {
        DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();

          // root elements
        Document doc = db.newDocument();
        Element rootElement = doc.createElement("XML");
        doc.appendChild(rootElement);

        /***** GeneratedSet ****/
        Element genSet = doc.createElement("GeneratedSet");
        rootElement.appendChild(genSet);

        Attr genDate = doc.createAttribute("genDate");
        genDate.setValue("11/01/2018");
        genSet.setAttributeNode(genDate);

        Attr genBy = doc.createAttribute("genBy");
        genBy.setValue("Tom Jones");
        genSet.setAttributeNode(genBy);

        Attr lev = doc.createAttribute("level");
        lev.setValue(level);
        genSet.setAttributeNode(lev);

        /****** Questions *****/
        Element questions = doc.createElement("Questions");
        genSet.appendChild(questions);

        Attr noq = doc.createAttribute("Questions");
        noq.setValue(addQuestions);
        questions.setAttributeNode(noq);

        Attr type = doc.createAttribute("Type");
        type.setValue(add);
        questions.setAttributeNode(type);

        /****** Question *****/
        int numOfQues = Integer.parseInt(addQuestions) ;
        int leve = Integer.parseInt(level) ;

        String retXML = null;
        if(add != null){
            InputSource is = new InputSource();
            genMaths gm = new genMaths();
            retXML = gm.additionQ(leve, 2, numOfQues, 0);
            is.setCharacterStream(new StringReader(retXML));
            doc = db.parse(is);
            //doc = db.parse(new InputSource(new StringReader(is.toString())));
        }
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File("C:\\Users\\xxxx\\Documents\\XML Files\\RandomQuestions.xml"));

            transformer.transform(source, result);
            System.out.println("File saved!");

    } catch (ParserConfigurationException | TransformerException pce) {} catch (SAXException ex) {
        Logger.getLogger(XmlServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
   }
 }

retXML:-

        public String forwardQ ( int level, int operands, int operation, int questions, int type )
    {
        StringBuffer retXML = new StringBuffer ();
        float operand = 0;
        float answer = 0;
        int minVal = (int)getLevelMin(level);
        int maxVal = (int)getLevelMax(level);

        String addSign = "";

        for ( int j = 0; j < questions; j++ )
        {
            retXML.append("<Question Text='");
            addSign = "";

            if ( operation == 1 )
            {
                answer = 0;
            }
            else
            {
                answer = 1;
            }

            for ( int i = 0; i < operands; i++ )
            {
                operand = randNum(minVal, maxVal);
                if ( operation == 1 )
                {
                    answer = answer + operand;
                }
                else
                {
                    answer = answer * operand;
                }
                retXML.append( addSign + operand );
                if ( operation == 1 )
                {
                    addSign = " + ";
                }
                else
                {
                    addSign = " x ";
                }
            }

            if ( type == 1 )
            {
                retXML.append("' Answer='"+ answer + "'>");            
            }
            else
            {
                retXML.append(createMultiChoice(answer));
            }
            retXML.append("</Question>" + System.getProperty("line.separator"));
        }

        return ( retXML.toString() );
    }

    public String additionQ ( int level, int operands, int questions, int type )
    {
        return ( forwardQ ( level, operands, 1, questions, type ) );
    }

從您的代碼中,您的XML看起來就像最終一樣

<Question ...></Question>
<Question ...></Question>

XML文檔中不能有多個根元素。 您可以嘗試將所有Question元素包裝在根元素中,例如

<Questions>
    <Question ...></Question>
    <Question ...></Question>
</Questions>

只需確保您只有一個元素作為您要轉換的內容的根

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM