2012-02-24 4 views
6

में एक्सएमएल के एन्कोडिंग प्रकार प्राप्त करना मैं जावा 1.4 में DocumentBuilder का उपयोग कर एक्सएमएल पार्स कर रहा हूं। के रूप मेंजावा

xml version="1.0" encoding="GBK" 

मैं XML का एन्कोडिंग प्रकार मिलता है और इसका उपयोग करना चाहते
एक्सएमएल पहली पंक्ति है। मैं "जीबीके"
मूल रूप से मैं एक और एक्सएमएल बनाउंगा जहां मैं बनाए रखने के लिए encoding="GBK" प्राप्त कर सकता हूं।
वर्तमान में यह खो रहा है और डिफ़ॉल्ट पर सेट किया गया है यूटीएफ -8
विभिन्न एन्कोडिंग के साथ कई एक्सएमएल हैं जिन्हें मुझे एन्कोडिंग ओडी स्रोत और आवश्यक चीजों को पढ़ने की आवश्यकता है।

अपने फ़ाइल को पार्स करने javax.xml.stream.XMLStreamReader का उपयोग करने सहायता

+2

'org.w3c.dom.Document.getXmlEncoding()' ?? – artbristol

+0

भले ही यह पुराना है: एक आधिकारिक डब्ल्यू 3 सी कथन है: https://www.w3.org/TR/xml/#sec-guessing –

उत्तर

0

, तो आप getEncoding() कॉल कर सकते हैं करें। यह करने के लिए

+0

बीटी मुझे जावा 1.4 – user1228785

4

एक तरीका यह

final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(new FileReader(testFile)); 

//running on MS Windows fileEncoding is "CP1251" 
String fileEncoding = xmlStreamReader.getEncoding(); 

//the XML declares UTF-8 so encodingFromXMLDeclaration is "UTF-8" 
String encodingFromXMLDeclaration = xmlStreamReader.getCharacterEncodingScheme(); 
+0

में इसकी आवश्यकता है मेरी एमएस विंडोज मशीन पर, 'getEncoding () '* हमेशा * रिटर्न 'शून्य'। 'getCharacterEncodingScheme()' केवल घोषित एन्कोडिंग लौटाता है * फ़ाइल * में यूटीएफ -8 बाइट ऑर्डर चिह्न नहीं है, अन्यथा 'शून्य' भी है। – Paramaeleon

1

विभिन्न एन्कोडिंग के लिए यह एक काम करता है, चिंता में दोनों बीओएम और XML घोषणा लेने की तरह काम करता है। UTF-8 को चूक करता है, तो न तो लागू होता है:

String encoding; 
FileReader reader = null; 
XMLStreamReader xmlStreamReader = null; 
try { 
    InputSource is = new InputSource(file.toURI().toASCIIString()); 
    XMLInputSource xis = new XMLInputSource(is.getPublicId(), is.getSystemId(), null); 
    xis.setByteStream(is.getByteStream()); 
    PropertyManager pm = new PropertyManager(PropertyManager.CONTEXT_READER); 
    for (Field field : PropertyManager.class.getDeclaredFields()) { 
     if (field.getName().equals("supportedProps")) { 
      field.setAccessible(true); 
      ((HashMap<String, Object>) field.get(pm)).put(
        Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY, 
        new XMLErrorReporter()); 
      break; 
     } 
    } 
    encoding = new XMLEntityManager(pm).setupCurrentEntity("[xml]".intern(), xis, false, true); 
    if (encoding != "UTF-8") { 
     return encoding; 
    } 

    // From @matthias-heinrich’s answer: 
    reader = new FileReader(file); 
    xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(reader); 
    encoding = xmlStreamReader.getCharacterEncodingScheme(); 

    if (encoding == null) { 
     encoding = "UTF-8"; 
    } 
} catch (RuntimeException e) { 
    throw e; 
} catch (Exception e) { 
    throw new UndeclaredThrowableException(e); 
} finally { 
    if (xmlStreamReader != null) { 
     try { 
      xmlStreamReader.close(); 
     } catch (XMLStreamException e) { 
     } 
    } 
    if (reader != null) { 
     try { 
      reader.close(); 
     } catch (IOException e) { 
     } 
    } 
} 
return encoding; 

साथ जावा 6 पर परीक्षण किया गया:

बीओएम साथ
  • UTF-8 एक्सएमएल फ़ाइल, बीओएम बिना
  • UTF-8 एक्सएमएल फ़ाइल ✓ XML घोषणा के साथ,
  • ✓ XML घोषणा के साथ
  • UTF-8 एक्सएमएल फ़ाइल बीएम के साथ, एक्सएमएल घोषणा के बिना ✓
  • UTF-8 एक्सएमएल फ़ाइल बिना एक्सएमएल के ✓

स्थायी

  • ISO-8859-1 एक्सएमएल फ़ाइल (कोई बीओएम) ✓ घोषणा,
  • बीओएम साथ
  • UTF-16LE एक्सएमएल फ़ाइल ✓ XML घोषणा के साथ,
  • बीओएम साथ
  • UTF-16BE एक्सएमएल फ़ाइल ✓ XML घोषणा के बिना XML घोषणा के बिना, इन दिग्गजों के कंधों पर:

    import java.io.*; 
    import java.lang.reflect.*; 
    import java.util.*; 
    import javax.xml.stream.*; 
    import org.xml.sax.*; 
    import com.sun.org.apache.xerces.internal.impl.*; 
    import com.sun.org.apache.xerces.internal.xni.parser.*;