كيف يمكنني تحميل org.w3c.دوم.وثيقة XML في سلسلة ؟

StackOverflow https://stackoverflow.com/questions/33262

  •  09-06-2019
  •  | 
  •  

سؤال

لدي كامل مستند XML في سلسلة ولا مثل Document الكائن.جوجل يتحول كل أنواع القمامة.ما هو أبسط حل ؟ (في جافا 1.5)

الحل شكرا مات McMinn, أنا قد استقر على هذا التنفيذ.له الحق في مستوى من إدخال المرونة استثناء تحبب بالنسبة لي.(أنه من الجيد أن نعرف إذا كان الخطأ جاء من تالف XML SAXException أو مجرد سوء IO - IOException.)

public static org.w3c.dom.Document loadXMLFrom(String xml)
    throws org.xml.sax.SAXException, java.io.IOException {
    return loadXMLFrom(new java.io.ByteArrayInputStream(xml.getBytes()));
}

public static org.w3c.dom.Document loadXMLFrom(java.io.InputStream is) 
    throws org.xml.sax.SAXException, java.io.IOException {
    javax.xml.parsers.DocumentBuilderFactory factory =
        javax.xml.parsers.DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    javax.xml.parsers.DocumentBuilder builder = null;
    try {
        builder = factory.newDocumentBuilder();
    }
    catch (javax.xml.parsers.ParserConfigurationException ex) {
    }  
    org.w3c.dom.Document doc = builder.parse(is);
    is.close();
    return doc;
}
هل كانت مفيدة؟

المحلول

يعمل هذا بالنسبة لي في جافا 1.5 - لقد جردت من الاستثناءات المحددة من أجل القراءة.

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;

public Document loadXMLFromString(String xml) throws Exception
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();

    return builder.parse(new ByteArrayInputStream(xml.getBytes()));
}

نصائح أخرى

مهلا هناك!

هناك مشكلة خطيرة مع هذا القانون لأنه يتجاهل ترميز الأحرف المحدد في String (والذي هو UTF-8 بشكل افتراضي).عند استدعاء String.getBytes() منصة الترميز الافتراضي المستخدمة في ترميز أحرف Unicode إلى بايت.لذا, محلل, قد تعتقد أنه من الحصول على UTF-8 البيانات في حين انها تحصل على EBCDIC أو ما شابه ليست جميلة!

بدلا من, استخدام تحليل الأسلوب الذي يأخذ InputSource التي يمكن بناؤها مع القارئ ، مثل هذا:

import java.io.StringReader;
import org.xml.sax.InputSource;
…
        return builder.parse(new InputSource(new StringReader(xml)));

قد لا يبدو مثل صفقة كبيرة ، ولكن الجهل ترميز الأحرف القضايا يؤدي إلى غدرا رمز تعفن أقرب إلى y2k.

فقط لدي مشكلة مماثلة ، إلا أنني في حاجة إلى NodeList و لا مستند هنا ما جئت حتى مع.انها في معظمها نفس الحل كما كان من قبل ، تضاف إلى الحصول على العنصر الجذر إلى أسفل كما NodeList واستخدام إريكسون اقتراح باستخدام InputSource بدلا عن حرف ترميز القضايا.

private String DOC_ROOT="root";
String xml=getXmlString();
Document xmlDoc=loadXMLFrom(xml);
Element template=xmlDoc.getDocumentElement();
NodeList nodes=xmlDoc.getElementsByTagName(DOC_ROOT);

public static Document loadXMLFrom(String xml) throws Exception {
        InputSource is= new InputSource(new StringReader(xml));
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = null;
        builder = factory.newDocumentBuilder();
        Document doc = builder.parse(is);
        return doc;
    }

التعامل مع XML في جافا, أنا دائما أميل إلى استخدام محول API:

import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;

public static Document loadXMLFrom(String xml) throws TransformerException {
    Source source = new StreamSource(new StringReader(xml));
    DOMResult result = new DOMResult();
    TransformerFactory.newInstance().newTransformer().transform(source , result);
    return (Document) result.getNode();
}   
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top