Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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 使用Jackson从XML创建自定义对象_Java_Xml_Jackson - Fatal编程技术网

Java 使用Jackson从XML创建自定义对象

Java 使用Jackson从XML创建自定义对象,java,xml,jackson,Java,Xml,Jackson,我收到一个大的XML文档,我需要从中提取一些字段,然后返回它们。 问题是,当我研究如何用Jackson反序列化对象的各种解决方案时,主要是1对1映射,或者是构建自定义解析器。 我的情况差不多就是这样 XML 我只对C X Z E的值感兴趣,所以在java中重新创建整个结构绝对是不可能的。实现自定义解析器听起来也有点过头了。 有更好的解决方案吗(通过注释或类似的方式)?我记得不久前,我见过一个库,它允许通过注释进行操作,但现在我在可以使用的库方面受到了一些限制 您应该看看DSM库。它正是你想要的

我收到一个大的XML文档,我需要从中提取一些字段,然后返回它们。 问题是,当我研究如何用Jackson反序列化对象的各种解决方案时,主要是1对1映射,或者是构建自定义解析器。 我的情况差不多就是这样

XML

我只对C X Z E的值感兴趣,所以在java中重新创建整个结构绝对是不可能的。实现自定义解析器听起来也有点过头了。
有更好的解决方案吗(通过注释或类似的方式)?我记得不久前,我见过一个库,它允许通过注释进行操作,但现在我在可以使用的库方面受到了一些限制

您应该看看DSM库。它正是你想要的


最明显的方法是使用XPath。这包含在Java中-没有额外的库。虽然有很多方法可以满足您的需求,但我编写了一个快速测试:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class XPathDemo {
    private static final String xmlString = "<a>\n" +
            " <b>\n" +
            "   <c>val</c>\n" +
            "   <d x=\"x-val\" z=\"z-val\"><e>e-val</e><f>lot of irrelevant fields</f></d>\n" +
            "   <g>lot of irrelevant fields</g>\n" +
            "  </b>\n" +
            "</a>";

    public static void main(String[] argv) throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse(new ByteArrayInputStream(xmlString.getBytes(StandardCharsets.UTF_8)));

        XPath xpath = XPathFactory.newInstance().newXPath();
        String c_value = (String) xpath.evaluate("/a/b/c/text()", document, XPathConstants.STRING);
        System.out.println( "value of c is \"" + c_value + "\"");

        String x_value = (String) xpath.evaluate("/a/b/d/@x", document, XPathConstants.STRING);
        System.out.println( "value of x is \"" + x_value + "\"");

        String z_value = (String) xpath.evaluate("/a/b/d/@z", document, XPathConstants.STRING);
        System.out.println( "value of z is \"" + z_value + "\"");

        String e_value = (String) xpath.evaluate("/a/b/d/e/text()", document, XPathConstants.STRING);
        System.out.println( "value of e is \"" + e_value + "\"");
    }
}
这是一个超级简单的例子。当你重复多次相同的基本结构时,它会变得更加困难。我已经读过了,因为它非常强大,但有时要得到你想要的东西会有点痛苦

您应该了解以下几点注意事项:

您需要有效的XML。你发布的内容不起作用,也不会起作用。 这将把整个文档读入内存。如果你有几千行就可以了。但如果您有10GB的文档,则可能需要另一种方式。
您可以构建一个最小的dto,并用@JsonIgnorePropertiesignoreUnknown=true注释该类,请参见@MichaelKreutz当我解析XML时,这个示例是关于JSON的,这样行吗?我是否需要在dto中复制嵌套结构?因为它比我的示例稍微复杂一些,所以我没有尝试它,但我认为它也适用于XML。您需要对感兴趣的字段的结构进行建模—所有其他字段都可以省略。还将@Json前缀注释与xml解析结合使用……正如我提到的,我对其他库不感兴趣。我在非常封闭的环境中工作,所以添加一些随机库对我来说不是有效的方法。
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class XPathDemo {
    private static final String xmlString = "<a>\n" +
            " <b>\n" +
            "   <c>val</c>\n" +
            "   <d x=\"x-val\" z=\"z-val\"><e>e-val</e><f>lot of irrelevant fields</f></d>\n" +
            "   <g>lot of irrelevant fields</g>\n" +
            "  </b>\n" +
            "</a>";

    public static void main(String[] argv) throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse(new ByteArrayInputStream(xmlString.getBytes(StandardCharsets.UTF_8)));

        XPath xpath = XPathFactory.newInstance().newXPath();
        String c_value = (String) xpath.evaluate("/a/b/c/text()", document, XPathConstants.STRING);
        System.out.println( "value of c is \"" + c_value + "\"");

        String x_value = (String) xpath.evaluate("/a/b/d/@x", document, XPathConstants.STRING);
        System.out.println( "value of x is \"" + x_value + "\"");

        String z_value = (String) xpath.evaluate("/a/b/d/@z", document, XPathConstants.STRING);
        System.out.println( "value of z is \"" + z_value + "\"");

        String e_value = (String) xpath.evaluate("/a/b/d/e/text()", document, XPathConstants.STRING);
        System.out.println( "value of e is \"" + e_value + "\"");
    }
}
value of c is "val"
value of x is "x-val"
value of z is "z-val"
value of e is "e-val"