在Java中验证RESTful服务的XML响应有什么好方法?

时间:2015-12-23 09:26:16

标签: java json xml rest jaxb

我在Java中执行简单的RESTFUL服务API验证。

以JSON格式处理响应非常方便。使用org.json库,可以很容易地将 JSON字符串从RESTFUL响应转换为 JSON对象,并将其与预期的JSON字符串进行比较。

JSONObject response = new JSONObject(json_response_str);
JSONObject expected = new JSONObject(json_expected_str);
JSONAssert.assertEquals(expected, response, JSONCompareMode.LENIENT);

如果是需要比较的JSON响应的某些元素,它也很容易,因为很容易使用以下API从JSONObject中提取子元素:

JSONObject element_in_response = response.get("..."); or
JSONObject element_in_response = response.getJSONObject("...");

但是,要处理XML格式的响应,事情就更难了。要将整个XML响应与预期的XML进行比较并不错,我可以使用XMLUnit来完成它:

String xml_response_str = ...
String xml_expected_str = ...
assertXMLEquals(xml_response_str, xml_expected_str);

但是,没有像JSON中那样的xmlOject之类的东西。

那么,如果想要将XML响应的某些元素与预期进行比较,该怎么办?

我有搜索论坛,有时会提到JAXB。我检查过它是关于将XML解析为Java对象的。所以我应该解析响应XML字符串和期望的XML字符串,然后将元素解压缩为Java对象,然后比较它们?这似乎很复杂,更不用说我需要XML模式开始。

执行此操作的有效方法是,有什么方法与JSON一样方便吗?

谢谢,

3 个答案:

答案 0 :(得分:1)

您可以尝试使用XPATH。

有一个简短的例子。 这是XML字符串:

<?xml version="1.0" encoding="UTF-8"?>
    <resp>
    <status>good</status>
    <msg>hi</msg>
</resp>

以下代码将获取状态和消息:

String xml = "<resp><status>good</status><msg>hi</msg></resp>";
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
InputSource source = new InputSource(new StringReader(xml));
Document doc = (Document) xpath.evaluate("/", source, XPathConstants.NODE);
String status = xpath.evaluate("/resp/status", doc);
String msg = xpath.evaluate("/resp/msg", doc);
System.out.println("status=" + status);
System.out.println("Message=" + msg);

以下是有关如何使用XPATH的更多示例: http://viralpatel.net/blogs/java-xml-xpath-tutorial-parse-xml/

答案 1 :(得分:0)

有许多方法可以测试XML。将XML转换为JSON不是其中之一,但可以完成。

测试XML通常使用XPath样式比较来执行,这些比较侧重于元素,属性和内容,而不是比较块。

从查看代码开始,您已熟悉http://xmlunit.sourceforge.net/api/org/custommonkey/xmlunit/XMLAssert.htm中的XML断言,但您可能还需要查看http://www.w3schools.com/xsl/xpath_intro.asp

XML验证并不那么容易,并且需要花费很多精力才能开始。一旦你有了测试工具,它就会变得更容易。

答案 2 :(得分:0)

验证(或提取)XML独立于协议,RESTful服务等,但它通常用于SOAP服务。

与JSON的比较很有意思。使用php,javascript,...更容易使用JSON。

如果要连接两个java服务器,XML就足够了,或者是普通的java Objects(不是其他语言的可移植解决方案)。

更好地指出使用XML:它更强大,更强大,标准化,并且你有很多工具可以处理它。

你在问什么:相当于JSONobject存在于XML中一段时间​​:它是一个DOM文档或一个节点。

1阅读您的XML

String xml="<root>content</root>";
DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// PARSE
Document document = builder.parse(new InputSource(new StringReader(xml)));

2获取某些特定数据的最佳方法:XPath:您为数据提供了一些路径(root / group / class1 / other_group / ...),您可以输入通配符(*),选择参数,值等 看到这个: How to read XML using XPath in Java

XPath xpath = XPathFactory.newInstance().newXPath();
String expression="/root";

3你可以获得直接值

expression="/root/text()";
String value = xpath.evaluate(expression, document);

4或者您获得所有数据(如果有的话)

XPathExpression expr = xpath.compile(expression) ; 
NodeList nodes  = (NodeList) expr.evaluate(document, XPathConstants.NODESET);

  for (int i = 0; i < nodes.getLength(); i++) 
      {
      Node nodeSegment = nodes.item(i);
     if (nodeSegment.getNodeType() == Node.ELEMENT_NODE)
           {
           Element eElement = (Element) nodeSegment;
           System.out.println("TAG="+eElement.getTagName());
           System.out.println("VALUE="+eElement.getNodeValue());