【问题标题】:How to deserialize XML result from a HTTP POST request in Java?如何反序列化来自 Java 中的 HTTP POST 请求的 XML 结果?
【发布时间】:2011-01-12 13:36:22
【问题描述】:

在 C# 中,我创建一个 http 帖子并以字节数组 (bret) 的形式在响应中获取一个 xml,我很容易将其反序列化为一个类:

MemoryStream m = new MemoryStream(bret);
XmlSerializer s = new XmlSerializer(typeof(TransactionResults));
TransactionResults t = (TransactionResults)s.Deserialize(m);

在 Java 中做同样事情的正确和最简单的方法是什么?

【问题讨论】:

  • 随意将标题编辑为更正确的内容

标签: c# java xml xml-serialization http-post


【解决方案1】:

通过类似的方式发出您的 POST 请求

http://www.exampledepot.com/egs/java.net/post.html

或使用 HttpClient:

http://hc.apache.org/httpclient-3.x/methods/post.html

根据您对数据进行序列化的方式,您应该使用相应的反序列化器。 XStream 是此类任务的一个不错的简单选择:

http://x-stream.github.io/

诚然,所有这些都需要更多代码,但这是 .NET 与 Java 系统的典型权衡(虽然代码更多,但 Java 也有优势)。

【讨论】:

    【解决方案2】:

    使用X-Stream - 获取请求:

    XStream xstream = new XStream(new DomDriver());
    xstream.alias("person", Person.class);
    URL url = new URL("www.foo.bar/person/name/foobar");
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
    Person foobar = (Person) xstream.fromXML(in);
    

    您可以修改对 url 的调用以获取 post

    【讨论】:

      【解决方案3】:

      JAXB is the Java standard (JSR-222) 用于将对象转换为具有多种实现的 XML:MetroEclipseLink MOXy(我是技术主管)、Apache JaxMe

      可以在 Java 中使用如下代码访问 HTTP 操作:

      String uri =
          "http://localhost:8080/CustomerService/rest/customers/1";
      URL url = new URL(uri);
      HttpURLConnection connection =
          (HttpURLConnection) url.openConnection();
      connection.setRequestMethod("GET");
      connection.setRequestProperty("Accept", "application/xml");
      
      JAXBContext jc = JAXBContext.newInstance(Customer.class);
      InputStream xml = connection.getInputStream();
      Customer customer =
          (Customer) jc.createUnmarshaller().unmarshal(xml);
      
      connection.disconnect();
      

      以上代码示例来自:

      有关 JAXB 和 XStream 的比较,请参阅:

      【讨论】:

        【解决方案4】:

        如果您不想将结果映射到类中,您可能需要查看Resty。 它使访问 JSON、XML 或任何其他数据类型成为一种简单的方式。 这是将 Slashdot RSS 解析为 XML 并打印所有链接文章的代码。

        Resty r = new Resty();
        NodeList nl = r.xml("http://rss.slashdot.org/Slashdot/slashdotGamesatom").get("feed/entry/link");
        for (int i = 0, len = nl.getLength(); i < len; i++) {
            System.out.println(((Element)nl.item(i)).getAttribute("href"));
        }
        

        【讨论】:

          猜你喜欢
          • 2011-03-05
          • 1970-01-01
          • 2015-09-17
          • 2016-01-04
          • 1970-01-01
          • 1970-01-01
          • 2021-03-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多