Mam obiekt org.w3c.dom.Element
przekazany do mojej metody. Potrzebuję zobaczyć cały ciąg xml, w tym jego węzły podrzędne (cały wykres obiektów). Szukam metody, która może przekonwertować Element
na ciąg w formacie xml, który mogę System.out.println
na. Po prostu println()
na obiekcie "Element" nie będzie działać, ponieważ toString()
nie wypisze pliku xml i nie przejdzie przez jego węzeł potomny. Czy istnieje prosty sposób, bez pisania własnej metody, aby to zrobić? Dzięki.Jak wyświetlić plik org.w3c.dom.Element w formacie ciągu znaków w języku Java?
Odpowiedz
Nieobsługiwany w standardowym interfejsie API JAXP, użyłem w tym celu biblioteki JDom. Posiada funkcję drukarki, opcje formater itp http://www.jdom.org/
Zakładając, że chcemy pozostać przy standardowym API ...
można użyć DOMImplementationLS:
Document document = node.getOwnerDocument();
DOMImplementationLS domImplLS = (DOMImplementationLS) document
.getImplementation();
LSSerializer serializer = domImplLS.createLSSerializer();
String str = serializer.writeToString(node);
Jeśli < xml version = "1.0" encoding = "UTF-16"? > deklaracja przeszkadza, można użyć transformer zamiast:
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
StringWriter buffer = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(node),
new StreamResult(buffer));
String str = buffer.toString();
Jest to rozwiązanie, jeśli otrzymujesz [html: null] i oczekujesz kodu HTML. Dodał ten komentarz, aby google mógł indeksować odpowiedź z nadzieją. –
Nadal można używać LSSerializer i wyprowadzać "UTF-8". Zamiast tego użyj LSOutput z StringWriter i ustaw typ kodowania na "UTF- * 8" – ricosrealm
Działa z obiektem Dokumentu w3c, jak również – thirdy
Jeśli masz schematu XML lub może w inny sposób tworzenia powiązań JAXB do niego, można użyć JAXB naziemnego napisać do System.out:
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
@XmlRootElement
public class BoundClass {
@XmlAttribute
private String test;
@XmlElement
private int x;
public BoundClass() {}
public BoundClass(String test) {
this.test = test;
}
public static void main(String[] args) throws Exception {
JAXBContext jxbc = JAXBContext.newInstance(BoundClass.class);
Marshaller marshaller = jxbc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.marshal(new JAXBElement(new QName("root"),BoundClass.class,new Main("test")),System.out);
}
}
Prosty kod 4 linie, aby uzyskać String
bez xml-deklaracji (<?xml version="1.0" encoding="UTF-16"?>
) od org.w3c.dom.Element
DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0");
LSSerializer serializer = lsImpl.createLSSerializer();
serializer.getDomConfig().setParameter("xml-declaration", false); //by default its true, so set it to false to get String without xml-declaration
String str = serializer.writeToString(node);
Spróbuj jcabi-xml z jedną wkładką:
String xml = new XMLDocument(element).toString();
Z VTD-XML, można przejść do kursora i wykonać jedną rozmowę getElementFragment odzyskać segment (jak oznaczono przez jego przesunięcie i długość) ... Poniżej jest przykładem
import com.ximpleware.*;
public class concatTest{
public static void main(String s1[]) throws Exception {
VTDGen vg= new VTDGen();
String s = "<users><user><firstName>some </firstName><lastName> one</lastName></user></users>";
vg.setDoc(s.getBytes());
vg.parse(false);
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("https://stackoverflow.com/users/user/firstName");
int i=ap.evalXPath();
if (i!=1){
long l= vn.getElementFragment();
System.out.println(" the segment is "+ vn.toString((int)l,(int)(l>>32)));
}
}
}
to, co odbywa się w jcabi:
private String asString(Node node) {
StringWriter writer = new StringWriter();
try {
Transformer trans = TransformerFactory.newInstance().newTransformer();
// @checkstyle MultipleStringLiterals (1 line)
trans.setOutputProperty(OutputKeys.INDENT, "yes");
trans.setOutputProperty(OutputKeys.VERSION, "1.0");
if (!(node instanceof Document)) {
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
}
trans.transform(new DOMSource(node), new StreamResult(writer));
} catch (final TransformerConfigurationException ex) {
throw new IllegalStateException(ex);
} catch (final TransformerException ex) {
throw new IllegalArgumentException(ex);
}
return writer.toString();
}
i to działa dla mnie!
- 1. Sortowanie pojedynczego ciągu znaków w języku Java
- 2. Jak uzyskać bieżący znacznik czasu w formacie ciągu znaków w języku Java? "yyyy.MM.dd.HH.mm.ss"
- 3. Jak zamienić pierwsze wystąpienie ciągu znaków w języku Java?
- 4. format ciągu znaków w języku C#
- 5. Oblicz szerokość wyświetlania ciągu znaków w języku Java
- 6. Podstawowe pytanie w języku Java: Równość ciągu znaków
- 7. Uruchom kod z ciągu znaków w języku Java
- 8. Jak wpisywać cudzysłowy w ciągu znaków Java?
- 9. Przykłady znalezienia ciągu znaków w języku Python
- 10. Sposób powtarzania argumentu w formacie ciągu znaków w Scala
- 11. Selektywne dzielenie ciągu znaków w języku Perl
- 12. Jak odczytać obraz w formacie ico w języku Java?
- 13. Jak przekonwertować datę ciągu na znacznik czasu w języku Java?
- 14. numer z ciągu znaków w java
- 15. Konwersja ciągu znaków w formacie ddMyyyy na format DateTime
- 16. Utwórz ścieżkę z ciągu znaków w języku Java7
- 17. Wyświetl plik w formacie binarnym
- 18. liczyć określone znaki w ciągu znaków (Java)
- 19. Powtarzanie ciągu znaków w języku Java - podobnie jak w przypadku prostego wiersza Pythona
- 20. Parsowanie ciągu znaków w języku C#; czy istnieje czystszy sposób?
- 21. Jak uzyskać wartość wyliczenia z ciągu znaków w języku C#?
- 22. Jak dołączyć backslash w ciągu znaków w java
- 23. Parsowanie ciągów znaków JavaScript w języku Java
- 24. Utwórz obiekt pliku w pamięci z ciągu znaków w języku Java
- 25. Konwersja bajtów i znaków w języku Java
- 26. Jak analizować negatywnie w języku Java w języku Java
- 27. Dzielenie ostatniego separatora w ciągu znaków w języku Python?
- 28. Windows8 - Używanie zlokalizowanego ciągu znaków w języku C#
- 29. Jak utworzyć plik scala.collection.immutable.Seq z listy Java w języku Java?
- 30. Jak załadować plik org.w3c.dom.Document z XML w ciągu znaków?
+1, ponieważ nie jest to zamierzeniem standardowego interfejsu API org.w3c.dom. Jeśli interesują mnie bloki XML jako tekst, zazwyczaj próbuję je sparsować jako tekst z dopasowaniem do wyrażenia regularnego (jeśli kryteria wyszukiwania są łatwo reprezentowane jako wyrażenie regularne). –