_org.w3c.dom.Element
_オブジェクトをメソッドに渡しました。子ノード(オブジェクトグラフ全体)を含むxml文字列全体を表示する必要があります。 Element
を_System.out.println
_できるXML形式の文字列に変換できるメソッドを探しています。 println()
はxml形式を出力せず、その子ノードを通過しないため、 'Element'オブジェクトのtoString()
は機能しません。それを行う独自のメソッドを書かずに簡単な方法はありますか?ありがとう。
標準のAPIに固執したい場合...
DOMImplementationLS を使用できます。
Document document = node.getOwnerDocument();
DOMImplementationLS domImplLS = (DOMImplementationLS) document
.getImplementation();
LSSerializer serializer = domImplLS.createLSSerializer();
String str = serializer.writeToString(node);
<?xml version = "1.0" encoding = "UTF-16"?>宣言が煩わしい場合は、代わりに transformer を使用できます。
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();
String
xml-declarationなし(<?xml version="1.0" encoding="UTF-16"?>
)from 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);
XMLのスキーマを持っているか、そうでなければJAXBバインディングを作成できる場合は、JAXB Marshallerを使用して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);
}
}
標準JAXP APIではサポートされていません。この目的のためにJDomライブラリを使用しました。プリンター機能、フォーマッターオプションなどがあります。 http://www.jdom.org/
1つのライナーで jcabi-xml を試してください:
String xml = new XMLDocument(element).toString();
VTD-XML を使用すると、カーソルに渡して、単一のgetElementFragment呼び出しを実行して、セグメントを取得できます(オフセットと長さで示されます)。以下に例を示します。
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("/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)));
}
}
}
これは私が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();
}
そしてそれは私のために働く!