2009-12-22 6 views
15

मैं एक एक्सएमएल फ़ाइल को पार्स करने की कोशिश कर रहा हूं जिसमें कुछ विशेष वर्ण हैं जैसे "" डीओएम पार्सर का उपयोग करते हुए। मुझे saxparse अपवाद मिल रहा है "इकाई का संदर्भ एक delimiter के साथ समाप्त होना चाहिए"। क्या इस अपवाद को दूर करने का कोई तरीका है, क्योंकि मैं विशेष वर्णों को हटाने के लिए XML फ़ाइल को संशोधित नहीं कर सकता, क्योंकि यह विभिन्न एप्लिकेशन से आ रहा है। रूट तत्व प्राप्त करने के लिए कृपया इस एक्सएमएल फ़ाइल को पार्स करने का एक तरीका सुझाएं?org.xml.sax.SAXParseException: इकाई "टी" का संदर्भ ';' के साथ समाप्त होना चाहिए delimiter

अग्रिम

यह XML के हिस्से में धन्यवाद जो मैं

<P>EDTA/THAM WASH 
</P> 

<P>jhc^72. METER SOLVENT: Meter 21 LITERS of R. O. WATER through the add line into 
FT-250. Start agitator. 
</P> 

<P>R. O. WATER &lt;ZLl LITERS </P> 

<P>•  NOTE: The following is a tool control operation. The area within 10 feet of any open vessel or container is under tool control. </P> 

<P>-af . 73. CHARGE SOLIDS: Remove any unnecessary items from the tool controlled area. Indicate the numbers of each item that will remain in the tool controlled area during the operation in the IN box of the Tool Control Log. </P> 

<P>^___y_ a. To minimize the potential for cross contamination, confirm that no other solids are being charged or packaged in adjacent equipment. </P> 

<P>kk k WARNING: Wear protective gloves, air jacket and use local exhaust when handling TROMETHAMINE USP (189400) (THAM) (K-l--Irritant!). The THAM may be dusty. </P> 

<P>-&lt;&amp;^b . Charge 2.1 KG of TROMETHAMINE USP (189400) (THAM) into FT-250 through the top. </P> 

<P>TROMETHAMINE USP (189400) (THAM) </P> 

<P>Scale ID: // 7S </P> 

<P>LotNo.: qy/o^yo^ </P> 

<P>Gross: ^. S </P> 

<P>Tare: 10 ,1 </P> 

<P>Net:  J^l </P> 

<P>Total: JL'J </P> 

<P><Figure ActualText="&T "> 

<ImageData src="images/17PT 07009K_img_1.jpg"/> 
&amp;T </Figure> 
Checked by </P> 

उत्तर

12

को पार्स कर रहा हूँ मुझे यकीन है कि मैं सवाल समझ में नहीं हूँ। जहां तक ​​मुझे पता है, जब तक आप CDATA के अंदर नहीं हैं, तो अक्षरों को ; बंद किए बिना नग्न अमान्य हैं।

यदि यह आपकी XML फ़ाइल का मामला नहीं है, तो यह अमान्य है, और आपको इसे पार्स करने का एक और तरीका ढूंढना होगा, या SAX को पकड़ने से पहले इसे ठीक करना होगा।

यदि मैं यहां कुछ गलत समझ रहा हूं, तो आपको शायद वास्तविक एक्सएमएल का नमूना पोस्ट करना चाहिए ताकि हम आगे बढ़ सकें।

अद्यतन:

ऐसा लगता है कि:

Figure ActualText="&T " 

हमलावर रेखा है। क्या यह अनुभाग CDATA के भीतर है या नहीं? यदि नहीं, तो यह मान्य XML नहीं है और आपको SAX को इसे संभालने में सक्षम होने की उम्मीद नहीं करनी चाहिए।

आप की आवश्यकता होगी करने के लिए या तो:

  • परिवर्तन आवेदन है कि यह बनाया है, या
  • SAX द्वारा लोड होने से पहले इसे ठीक करें (यदि आप उस एप्लिकेशन को नहीं बदल सकते हैं) जैसे "Figure ActualText="&amp;T ""; या
  • पार्सिंग के लिए एक गैर-SAX विधि खोजें।
1

समाधान के लिए, आप कर सकते हैं:

  1. & की सभी घटनाओं की मूल इनपुट में &amp; के साथ बदलें;
  2. इसे पार्स करें;
  3. अपने कोड में जो परिणाम संभालता है, उस मामले को संभालें जहां आप अब अक्षर से बच निकले हैं (उदाहरण के लिए &lt;< के बजाय)।

पार्सर आप उपयोग कर रहे आधार पर, आप भी वर्ग को पार्स और & -strings न छोड़ने के लिए जिम्मेदार खोजने की कोशिश, और यदि आप इसे विस्तार कर सकते हैं/अपनी खुद की रिसोल्वर आपूर्ति देख सकते हैं। (जो मैं कह रहा हूं वह बहुत अस्पष्ट है, लेकिन विनिर्देश आपके द्वारा उपयोग किए जा रहे टूल पर निर्भर करते हैं।)

1

आपका इनपुट अमान्य XML है। विशेष रूप से, आपके पास एक विशेषता मान में '&' वर्ण नहीं हो सकता है जब तक कि यह एक अच्छी तरह से निर्मित चरित्र इकाई संदर्भ का हिस्सा न हो।

  • एक "बिल्कुल नहीं एक्सएमएल" लिखें अपने आप को पार्सर:

    AFAIK, आपके पास दो विकल्प। मुझे गंभीरता से संदेह है कि आपको एक मौजूदा मिल जाएगा। कोई भी आत्म-सम्मानित XML पार्सर अमान्य इनपुट को अस्वीकार कर देगा।

  • जो कुछ भी (तथाकथित) एक्सएमएल बना रहा है उसे ठीक करें ताकि यह उन जगहों पर यादृच्छिक '' वर्ण न रखे जहां उन्हें अनुमति नहीं है। यह वास्तव में काफी सरल है। जैसे ही आप एक्सएमएल बना रहे हैं, '&' वर्ण को प्रतिस्थापित करें जो पहले से ही ' amp' के साथ वर्ण संदर्भ का हिस्सा नहीं है।
25

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

String clean = xml.replaceAll("&([^;]+(?!(?:\\w|;)))", "&amp;$1"); 

क्या कि regex कर रहा है किसी भी बुरी तरह से गठन एंटिटी संदर्भ की तलाश में और एम्परसेंड भागने है ।

विशेष रूप से, (?!(?:\\w|;)) एक नकारात्मक दिखने वाला है जो उस मैच को किसी भी शब्द पर रोकता है जो शब्द वर्ण (ए-जेड, 0-9) नहीं है और अर्ध-कॉलन नहीं है। तो पूरे regex & से सबकुछ पकड़ता है जो एक नहीं है; पहले गैर-शब्द, गैर अर्द्ध-कोलन चरित्र तक।

यह पहले कैप्चर समूह में एम्परसैंड को छोड़कर सबकुछ रखता है ताकि इसे प्रतिस्थापित स्ट्रिंग में संदर्भित किया जा सके। वह $ 1 है।

ध्यान दें कि यह उन संदर्भों को ठीक नहीं करेगा जो वे वैध हैं लेकिन नहीं हैं। उदाहरण के लिए, यदि आपके पास था & टी; जो एक्सएमएल वास्तव में इकाई को परिभाषित करता है जब तक कि एक अलग तरह की त्रुटि पूरी तरह से फेंक देगा।

+0

बस एक छोटी टिप्पणी। यह निश्चित रूप से अमान्य है जो स्कीमा है, लेकिन पहले यह अच्छी तरह से गठित नहीं है। हम यहां स्कीमा के बारे में बात नहीं कर रहे हैं। – lkuty

+1

स्ट्रिंग xml = " आआ और बीबीबी और सीसीसी"; परिणाम आए & बीबीबी और सीसीसी। क्या इसे एक से अधिक और इनपुट स्ट्रिंग में काम करने के लिए बनाया जा सकता है? –

+5

हाँ। "&([^; और] + (?! (?: \\ w |;)))" (जोड़ा गया और pos 6 पर) - यह एकाधिक और इनपुट में काम करना चाहिए। – robbi5

8

आप में से कुछ अपने एक्सएमएल टेम्पलेट्स में कोड के किसी भी हिस्से को जोड़ने या बदलने के दौरान त्रुटि के साथ परिचित हो सकते हैं "इकाई एक्सएक्स का संदर्भ ';' delimiter 'के साथ समाप्त होना चाहिए। यहां तक ​​कि जब भी मैं अपने ब्लॉगर ब्लॉग के टेम्पलेट्स (एक्सएमएल) में कुछ कोड बदलने या जोड़ने की कोशिश करता हूं तो मुझे वह त्रुटि मिलती है।

अधिकांशतः इस तरह के त्रुटियां तब होती हैं जब हम किसी भी तृतीय-पक्ष बैनर या विजेट को हमारे XML टेम्पलेट्स में जोड़ते हैं। हम कोड के टुकड़े में मामूली बदलाव करके आसानी से उस त्रुटि को सुधार सकते हैं!

Just replace “&” with “&amp;” in your HTML/Javascript code! 

उदाहरण

ऊपर PSpeed ​​से निम्नलिखित replaceAll regex और प्रतिस्थापन पाठ भाग निकले ऐम्परसेंड के साथ सभी छोड़ा जाएगा ऐम्परसेंड का स्थान ले लेगा एक जवाब पर
Original Code: 
<!– Begin Code –> 
<script src="http://XXXXXX.com/XXX.php?sid=XXX&br=XXX&dk=XXXXXXXXXXXX" type="text/javascript"/> 
<!– End Code –> 

Altered Code: 

<!– Begin Code –> 
<script src="http://XXXXXX.com/XXX.php?sid=XXX&amp;br=XXX&amp;dk=XXXXXXXXXXXX" type="text/javascript"/> 
<!– End Code –> 
1

बिल्डिंग।

String clean = xml.replaceAll(("(&(?!amp;))", "&amp;")); 

पैटर्न एक नकारात्मक अग्रदर्शी किसी भी ऐम्परसेंड कि अभी तक फरार हो नहीं किया गया है और प्रतिस्थापन स्ट्रिंग बस एक भाग निकले एम्परसेंड है पर मैच के लिए है। यह स्थिर रूप से संकलित पैटर्न का उपयोग करके प्रदर्शन के लिए आगे अनुकूलित किया जा सकता है।

private final static Pattern unescapedAmpersands = Pattern.compile("(&(?!amp;))"); 

... 

Matcher m = unescapedAmpersands.matcher(xml); 
String xmlWithAmpersandsEscaped = m.replaceAll("&amp;"); 
0

बस अपने &&amp; के साथ बदलें और यह काम करेंगे।

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