2010-05-17 13 views
7

जावा का एक्सएमएल पार्सर सोच रहा है कि मेरा एक्सएमएल दस्तावेज़ मूल तत्व के बाद अच्छी तरह से गठित नहीं है। लेकिन मैंने इसे कई टूल के साथ मान्य कर दिया है और वे सभी असहमत हैं। यह शायद दस्तावेज़ में बजाए मेरे कोड में एक त्रुटि है। मैं वास्तव में किसी भी मदद की सराहना करता हूं जो आप सभी मुझे दे सकते हैं।जावा कह रहा है कि एक्सएमएल दस्तावेज़ अच्छी तरह से तैयार नहीं है

<?xml version="1.0"?> 
<tasklist> 
    <task> 
     <description>Task 1</description> 
     <due>Due date 1</due> 
     <comment>Comment 1</comment> 
     <completed>false</completed> 
    </task> 
    <task> 
     <description>Task 2</description> 
     <due>Due date 2</due> 
     <comment>Comment 2</comment> 
     <completed>false</completed> 
    </task> 
    <task> 
     <description>Task 3</description> 
     <due>Due date 3</due> 
     <comment>Comment 3</comment> 
     <completed>true</completed> 
    </task> 
</tasklist> 

है त्रुटि संदेश जावा मेरे लिए फेंक रहा है यहाँ और::

private void loadFromXMLFile(File f) throws ParserConfigurationException, IOException, SAXException { 
    File file = f; 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db; 
    Document doc = null; 
    db = dbf.newDocumentBuilder(); 
    doc = db.parse(file); 
    doc.getDocumentElement().normalize(); 
    String desc = ""; 
    String due = ""; 
    String comment = ""; 
    NodeList tasksList = doc.getElementsByTagName("task"); 
    for (int i = 0; i tasksList.getLength(); i++) { 
     NodeList attributes = tasksList.item(i).getChildNodes(); 
     for (int j = 0; i < attributes.getLength(); j++) { 
     Node attribute = attributes.item(i); 
     if (attribute.getNodeName() == "description") { 
      desc = attribute.getTextContent(); 
     } 
     if (attribute.getNodeName() == "due") { 
      due = attribute.getTextContent(); 
     } 
     if (attribute.getNodeName() == "comment") { 
      comment = attribute.getTextContent(); 
     } 
     tasks.add(new Task(desc, due, comment)); 
     } 
     desc = ""; 
     due = ""; 
     comment = ""; 
    } 
} 

निम्नलिखित एक्सएमएल फ़ाइल मैं लोड करने के लिए कोशिश कर रहा हूँ है:

यहाँ मेरी जावा विधि है

run: 
[Fatal Error] tasks.xml:28:3: The markup in the document following the root element must be well-formed. 
May 17, 2010 6:07:02 PM todolist.TodoListGUI <init> 
SEVERE: null 
org.xml.sax.SAXParseException: 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:239) 
     at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283) 
     at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:208) 
     at todolist.TodoListGUI.loadFromXMLFile(TodoListGUI.java:199) 
     at todolist.TodoListGUI.<init>(TodoListGUI.java:42) 
     at todolist.Main.main(Main.java:25) 
BUILD SUCCESSFUL (total time: 19 seconds) 

संदर्भ TodoListGUI.java:199 लिए

01 है
doc = db.parse(file); 

यदि संदर्भ किसी के लिए सहायक है, तो मैं एक सरल सूची बनाने के लिए एक सरल जीयूआई एप्लीकेशन लिखने की कोशिश कर रहा हूं जो कार्यों को परिभाषित करने वाली XML फ़ाइलों को पढ़ और लिख सकता है।

<?xml version="1.0" encoding="UTF-8" ?> 
+0

आप एक नमूना XML दस्तावेज़ पोस्ट कर सकते हैं? आप उन्हें दृश्यमान बनाने के लिए संपादित कर सकते हैं - –

+0

आपका एक्सएमएल टैग खाया किया गया है लगता है? आपको '' '' '<' 'के साथ '' 'प्राप्त करने में सक्षम होना चाहिए। – psmears

+0

@psmears: नहीं, बस 4 रिक्त स्थान या कोड का चयन करें और फिर संपादक टूलबार में '010101' बटन दबाएं या' Ctrl + K' कुंजी दबाएं। – BalusC

उत्तर

1

करने के लिए अपने XML घोषणा बदलने का प्रयास करें। जब मैं आपका कोड कॉपी करता हूं लेकिन पार्सर को स्ट्रिंग इनपुट के रूप में एक्सएमएल का उपयोग करता है तो यह ठीक काम करता है (कुछ मुद्दों को ठीक करने के बाद - attributes.item(i)attributes.item(j) होना चाहिए और attribute == null पर आपको लूप से बाहर निकलना होगा)।

आपकी त्रुटि को पुन: पेश करने की कोशिश में, यदि मैं एक और <tasklist></tasklist> तत्व जोड़ता हूं तो मुझे वही संदेश मिल सकता है। ऐसा इसलिए है क्योंकि एक्सएमएल में अब एक मूल तत्व (कार्यसूची) नहीं है। क्या यह समस्या आप देख रहे हैं? क्या XML में tasks.xml में एक एकल मूल तत्व है?

+1

आईव ने अपने स्वरूपण को ठीक किया है, अब यह –

+0

है और मैं केवल 'एन्कोडिंग' सुझाव देता हूं क्योंकि, जहां तक ​​मैं कह सकता हूं और परीक्षण कर सकता हूं, आप * पहले से ही एक अच्छी तरह से गठित XML दस्तावेज़ है ... शायद कुछ और चल रहा है आपके कोड में – EAMann

+0

मुझे कोशिश करने से कुछ भी नहीं मिला। यह अभी भी मुझे एन्कोडिंग प्रकार के साथ या बिना एक ही त्रुटि दे रहा है। – Pyroclastic

4

मुझे लगता है कि वहाँ कुछ वास्तविक फ़ाइल के साथ गलत हो सकता है:

0

इसके लायक होने के लिए, स्कैला आरईपीएल ने सफलतापूर्वक आपके मार्कअप को पार्स किया।

scala> val tree = <tasklist> 
| <task> 
| <description>Task 1</description> 
| <due>Due date 1</due> 
| <comment>Comment 1</comment> 
| <completed>false</completed> 
| </task> 
| <task> 
| <description>Task 2</description> 
| <due>Due date 2</due> 
| <comment>Comment 2</comment> 
| <completed>false</completed> 
| </task> 
| <task> 
| <description>Task 3</description> 
| <due>Due date 3</due> 
| <comment>Comment 3</comment> 
| <completed>true</completed> 
| </task> 
| </tasklist> 
tree: scala.xml.Elem = 
<tasklist> 
<task> 
<description>Task 1</description> 
<due>Due date 1</due> 
<comment>Comment 1</comment> 
<completed>false</completed> 
</task> 
<task> 
<description>Task 2</description> 
<due>Due date 2</due> 
<comment>Comment 2</comment> 
<completed>false</completed> 
</task> 
<task> 
<description>Task 3</description> 
<due>Due date 3</due> 
<comment>Comment 3</comment> 
<completed>true</completed> 
</task> 
</tasklist> 
12

org.xml.sax.SAXParseException: मूल तत्व निम्नलिखित दस्तावेज़ में मार्कअप अच्छी तरह से गठित किया जाना चाहिए।

यह विशेष रूप से अपवाद को इंगित करता है XML दस्तावेज़ में एक से अधिक मूल तत्व नहीं है। दूसरे शब्दों में, <tasklist> एकमात्र मूल तत्व नहीं है। उदाहरण के रूप में अपना एक्सएमएल दस्तावेज़ लेने के लिए, <tasklist> तत्व के बिना और रूट में तीन <task> तत्वों के बिना एक के बारे में सोचें। इससे इस प्रकार का अपवाद होगा।

चूंकि आपके द्वारा पोस्ट की गई XML फ़ाइल ठीक दिखती है, समस्या कहीं और है। ऐसा लगता है कि यह XML फ़ाइल को पार्स नहीं कर रहा है, जिसे आप उम्मीद करते हैं कि यह पार्सिंग है। त्वरित डिबगिंग के लिए, जोड़ने के अपने विधि के शीर्ष करने के लिए निम्न:

System.out.println(f.getAbsolutePath()); 

डिस्क फाइल सिस्टम में फ़ाइल ढूंढें और उसका सत्यापन करें।

+0

+1 यह वास्तव में मेरी समस्या थी। धन्यवाद! – Ben

0

इसके लायक होने के लिए एक और, जब मैं आपकी xml को test.xml नामक फ़ाइल में सहेजता हूं तो उसे प्राप्त होता है और xmllint के माध्यम से इसे चलाता है।

[[email protected]] [~] 
xmllint test.xml 
<?xml version="1.0"?> 
<tasklist> 
    <task> 
     <description>Task 1</description> 
     <due>Due date 1</due> 
     <comment>Comment 1</comment> 
     <completed>false</completed> 
    </task> 
    <task> 
     <description>Task 2</description> 
     <due>Due date 2</due> 
     <comment>Comment 2</comment> 
     <completed>false</completed> 
    </task> 
    <task> 
     <description>Task 3</description> 
     <due>Due date 3</due> 
     <comment>Comment 3</comment> 
     <completed>true</completed> 
    </task> 
</tasklist> 

ठीक हो रहा है। सबसे अधिक संभावना है कि आपके पास कुछ भयानक पात्र हैं जिन्हें आप अपनी वास्तविक फ़ाइल में कहीं भी नहीं देख सकते हैं। एक संपादक है कि, प्रिंट न हो सकने पात्रों दिखाएगा अगर यह एक अंग्रेजी UTF-8 मशीन आप कुछ यूनिकोड वर्ण है कि आप उस पार्सर करता नहीं देख सकते हो सकता है नहीं है की तरह किसी और सुझाव में वास्तविक फ़ाइल को देखने की कोशिश करें। वह या आप उस फाइल को लोड नहीं कर रहे हैं जो आपको लगता है कि आप हैं। चरण डिबगिंग और देखें कि फ़ाइल की वास्तविक सामग्री पार्सर में खिलाए जाने से पहले क्या होती है।

0

आप यह सुनिश्चित करें कि उस फ़ाइल में सब कुछ है क्या? त्रुटि शिकायत कर रही है कि वर्तमान रूट के बाद और अधिक मार्कअप हैं। तो </tasklist> के बाद कुछ और होना चाहिए।

कभी कभी, इस त्रुटि प्रिंट न हो सकने पात्रों की वजह से हो सकता है। यदि आप कुछ भी नहीं देखते हैं, तो फ़ाइल का हेक्सडम्प करें।

संबंधित मुद्दे

 संबंधित मुद्दे