如何在java中将org.w3c.dom.Element输出为字符串格式?
我将一个如何在java中将org.w3c.dom.Element输出为字符串格式?,java,xml,dom,Java,Xml,Dom,我将一个org.w3c.dom.Element对象传递到我的方法中。我需要查看整个xml字符串,包括它的子节点(整个对象图)。我正在寻找一种方法,可以将元素转换为xml格式字符串,我可以System.out.println打开该字符串。仅对“Element”对象执行println()将不起作用,因为toString()不会输出xml格式,也不会通过其子节点。有没有一种简单的方法不需要写我自己的方法就可以做到这一点?谢谢。标准JAXP API不支持,为此我使用了JDom库。它具有打印机功能、格式化
org.w3c.dom.Element
对象传递到我的方法中。我需要查看整个xml字符串,包括它的子节点(整个对象图)。我正在寻找一种方法,可以将元素
转换为xml格式字符串,我可以System.out.println
打开该字符串。仅对“Element”对象执行println()
将不起作用,因为toString()
不会输出xml格式,也不会通过其子节点。有没有一种简单的方法不需要写我自己的方法就可以做到这一点?谢谢。标准JAXP API不支持,为此我使用了JDom库。它具有打印机功能、格式化程序选项等。假设您想坚持使用标准API
您可以使用:
如果声明令您感到困扰,您可以使用:
如果您拥有XML的模式或可以为其创建JAXB绑定,则可以使用JAXB封送器写入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);
}
}
从
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);
试着用一个班轮:
String xml = new XMLDocument(element).toString();
使用,您可以传入游标并进行单个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)));
}
}
}
导入com.ximpleware.*;
公共类证书{
公共静态void main(字符串s1[])引发异常{
VTDGen vg=新VTDGen();
String s=“someone”;
setDoc(s.getBytes());
解析(false);
VTDNav vn=vg.getNav();
自动驾驶仪ap=新自动驾驶仪(vn);
ap.selectXPath(“/users/user/firstName”);
int i=ap.evalXPath();
如果(i!=1){
long l=vn.getElementFragment();
System.out.println(“段为”+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();
}
这对我很有用 如果您得到[html:null]并且希望得到html,那么这就是解决方案。添加了这条评论,这样谷歌就可以很有希望地为答案编制索引。你仍然可以使用LSSerializer并输出“UTF-8”。将LSOutput改为与StringWriter一起使用,并将编码类型设置为“UTF-*8”也适用于w3c文档对象。。。我们还可以添加这一行
serializer.getDomConfig().setParameter(“xml声明”,false)代码>在第一个解决方案中…感谢您的回答,这真是太好了。但我有一个问题,有时匹配部分的一些标记被删除,它们的文本内容被单独显示。您对这个问题有什么建议吗?+1因为它不是标准org.w3c.domapi的目的。如果我对XML块作为文本感兴趣,我通常只尝试使用正则表达式匹配将其解析为文本(如果搜索条件很容易表示为正则表达式)。jcabi XML的新版本不支持元素作为参数,只支持节点/文件/字符串。
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)));
}
}
}
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();
}