2011-08-08 17 views
6

मैं एक प्रक्रिया है कि जैसा कि नीचे दिखाया JDOM और xpath का उपयोग कर फ़ाइल को पार्स करने एक XML फ़ाइल को पार्स करता है:पार्सिंग विकृत/अधूरा/अमान्य एक्सएमएल फाइल

private static SAXBuilder builder   = null; 
private static Document  doc   = null; 
private static XPath  xpathInstance  = null; 

builder = new SAXBuilder(); 
Text list = null; 

try { 
    doc = builder.build(new StringReader(xmldocument)); 

} catch (JDOMException e) { 
      throw new Exception(e); 
} 



try { 
    xpathInstance = XPath.newInstance("//book[author='Neal Stephenson']/title/text()"); 
    list = (Text) xpathInstance.selectSingleNode(doc); 
} catch (JDOMException e) { 
    throw new Exception(e); 
} 

ऊपर ठीक काम करता है। Xpath अभिव्यक्तियों को गुण फ़ाइल में संग्रहीत किया जाता है ताकि इन्हें कभी भी बदला जा सके। अब मुझे कुछ और XML फ़ाइलों को संसाधित करना है जो एक विरासत प्रणाली से आती हैं जो केवल xml फ़ाइलों को 4000 बाइट्स के हिस्सों में भेजती है। मौजूदा प्रसंस्करण 4000 बाइट हिस्सों को पढ़ता है और डेटाबेस में एक पंक्ति के रूप में प्रत्येक खंड के साथ ओरेकल डेटाबेस में संग्रहीत करता है (विरासत प्रणाली में कोई भी परिवर्तन करना या डेटाबेस में पंक्तियों के रूप में भाग को संग्रहीत करने वाला प्रसंस्करण प्रश्न से बाहर है) ।

मैं एक विशिष्ट XML दस्तावेज़ से संबंधित सभी पंक्तियों को निकालने और उन्हें विलय करके पूर्ण वैध XML दस्तावेज़ बना सकता हूं और फिर XML दस्तावेज़ को पार्स करने के लिए मौजूदा प्रसंस्करण (ऊपर दिखाया गया) का उपयोग कर सकता हूं।

हालांकि बात यह है कि, XML दस्तावेज़ से निकालने के लिए मुझे आवश्यक डेटा पहले 4000 बाइट्स पर हमेशा होगा। यह खंड एक वैध XML दस्तावेज़ नहीं है क्योंकि यह अपूर्ण होगा लेकिन इसमें आवश्यक सभी डेटा शामिल होंगे। मैं सिर्फ एक खंड को पार्स नहीं कर सकता क्योंकि जेडीओएम निर्माता इसे अस्वीकार कर देगा।

मुझे आश्चर्य है कि क्या मैं वैध XML दस्तावेज़ प्राप्त करने के लिए सभी हिस्सों (जो काफी से अधिक हो सकता है) को विलय किए बिना विकृत XML खंड को पार्स कर सकता हूं। यह मुझे जांचने के लिए डेटाबेस में कई यात्राओं को बचाएगा कि क्या कोई हिस्सा उपलब्ध है या नहीं और मुझे पहले 4000 बाइट्स का उपयोग करने में सक्षम होने के लिए केवल 100 हिस्सों को मर्ज करना होगा।

मुझे पता है कि मैं प्रासंगिक डेटा निकालने के लिए जावा के स्ट्रिंग फ़ंक्शंस का उपयोग कर सकता हूं लेकिन क्या यह एक पार्सर या यहां तक ​​कि xpath का उपयोग करके संभव है? या क्या वे दोनों एक्सएमएल दस्तावेज को एक अच्छी तरह से गठित दस्तावेज़ होने की उम्मीद करते हैं इससे पहले कि यह इसे पार्स कर सके?

उत्तर

5

आप अवैध XML को पार्स करने के लिए JSoup का उपयोग करने का प्रयास कर सकते हैं। परिभाषा के अनुसार एक्सएमएल अच्छी तरह से गठित होना चाहिए, अन्यथा यह अमान्य है और इसका उपयोग नहीं किया जाना चाहिए।

अद्यतन - उदाहरण:

public static void main(String[] args) { 
    for (Node node : Parser.parseFragment("<test><author name=\"Vlad\"><book name=\"SO\"/>" , 
      new Element(Tag.valueOf("p"), ""), 
      "")) { 
     print(node, 0); 
    } 
} 

public static void print(Node node, int offset) { 
    for (int i = 0; i < offset; i++) { 
     System.out.print(" "); 
    } 
    System.out.print(node.nodeName()); 
    for (Attribute attribute: node.attributes()) { 
     System.out.print(", "); 
     System.out.print(attribute.getKey() + "=" + attribute.getValue()); 
    } 
    System.out.println(); 
    for (Node child : node.childNodes()) { 
     print(child, offset + 4); 
    } 
} 
+0

धन्यवाद - मुझे लगता है कि इस HTML दस्तावेज़ के लिए विशिष्ट है। मैं एचटीएमएल के साथ काम नहीं कर रहा हूँ। – ziggy

+0

@ziggy: parseFragment() को आज़माएं! मेरा अपडेट देखें। – Vlad

+0

आह .. यह दिलचस्प है। मैं इसकी जांच करुँगा। धन्यवाद – ziggy

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