Mam kompletny dokument XML w postaci ciągu i chciałbym mieć Document
obiekt. Google wyrzuca różnego rodzaju śmieci. Jakie jest najprostsze rozwiązanie? (W Javie 1.5)
Rozwiązanie Dzięki Mattowi McMinnowi zdecydowałem się na tę implementację. Ma dla mnie odpowiedni poziom elastyczności wprowadzania danych i szczegółowości wyjątków. (Dobrze jest wiedzieć, czy błąd pochodzi ze zniekształconego kodu XML - SAXException
- czy po prostu złego 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;
}
Odpowiedzi:
To działa dla mnie w Javie 1.5 - usunąłem określone wyjątki dla czytelności.
źródło
getBytes()
bez uwzględnienia kodowania.return (Document) builder.parse(new ByteArrayInputStream(xml.getBytes()));
?Hej!
Istnieje potencjalnie poważny problem z tym kodem, ponieważ ignoruje on kodowanie znaków określone w
String
(którym jest domyślnie UTF-8). Gdy wywołujeszString.getBytes()
, domyślne kodowanie platformy jest używane do kodowania znaków Unicode na bajty. Zatem parser może pomyśleć, że pobiera dane UTF-8, podczas gdy w rzeczywistości pobiera EBCDIC lub coś… nieładne!Zamiast tego użyj metody analizy, która pobiera InputSource, które można skonstruować za pomocą czytnika, na przykład:
To może nie wydawać się wielkim problemem, ale nieznajomość problemów z kodowaniem znaków prowadzi do podstępnego gnicia kodu, podobnego do y2k.
źródło
Właśnie miałem podobny problem, z wyjątkiem tego, że potrzebowałem NodeList, a nie dokumentu, oto co wymyśliłem. Jest to w większości to samo rozwiązanie, co poprzednio, ulepszone, aby usunąć element główny jako NodeList i wykorzystując sugestię Ericksona, aby zamiast tego użyć InputSource do problemów z kodowaniem znaków.
źródło
Aby manipulować XML w Javie, zawsze używam Transformer API:
źródło