Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中将org.w3c.dom.Element输出为字符串格式?_Java_Xml_Dom - Fatal编程技术网

如何在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();
}