我在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一样方便吗?
谢谢,
答案 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());