java - 如何使用 Java 读取 XML 响应
问题描述
我正在调用 Web 服务并以 XML 格式获取响应。这是 XML 响应,
<Response>
<NO>1</NO>
<NAME>John Doe</NAME>
</Response>
<Response>
<NO>2</NO>
<NAME>Jane Doe</NAME>
</Response>
我正在尝试从每个响应中获取每个数据。我需要得到每个值。
这是我的Java代码,
Document document = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new InputSource(new StringReader(response.toString())));
NodeList nodeList = document.getElementsByTagName("Response");
System.out.println(nodeList.getLength());
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
NodeList id = (NodeList) element.getElementsByTagName("Response");
System.out.println(id);
NodeList nodeLists = element.getChildNodes();
for (int j = 0; j < nodeLists.getLength(); j++) {
Node n = nodeLists.item(j);
if (n.getNodeType() == Node.ELEMENT_NODE) {
Element name = (Element) n;
System.out.println(name.getAttributes().getNamedItem("NO").getNodeValue());
System.out.println(name.getAttributes().getNamedItem("NAME").getNodeValue());
}
}
}
}
但我无法得到我需要的东西。什么都没有打印。
我需要像这样打印每个值,
1
John Doe
2
Jane Doe
基本上,它需要遍历所有<Response>
标签并给我可用的数据。但是我的代码不起作用。
所以有人可以帮助我吗?非常感谢。
解决方案
我从不从事 XML 解析工作,但是当我在我的机器上调试您的代码时,我遇到了类似的错误,
[Fatal Error] :1:84: The markup in the document following the root element must be well-formed.
Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 84; The markup in the document following the root element must be well-formed.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
at com.flotomate.fd.system.etc.OprUtility.main(OprUtility.java:87)
并在 StackOverflow 上搜索是什么原因导致出现错误我找到了这个答案
问题不是添加了根元素。
添加根元素后仍然无法修复。所以我遵循与答案相同的模式
不确定优化和定义良好但工作
String response = " <root>"
+" <Response> "
+ " <NO>1</NO> "
+ " <NAME>John Doe</NAME> "
+ " </Response> "
+ " <Response> "
+ " <NO>2</NO> "
+ " <NAME>Jane Doe</NAME> "
+ " </Response> "
+ "</root>";
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
new InputSource(new StringReader(response.toString())));
NodeList nodeList = document.getDocumentElement().getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
if (element.getNodeName().contains("Response")) {
System.out.println(element.getElementsByTagName("NO").item(0).getTextContent());
System.out.println(element.getElementsByTagName("NAME").item(0).getTextContent());
}
}
}
//And from this also.....
for (int i = 0; i < nodeList.getLength(); i++) {
Element element1 = (Element) nodeList.item(i);
System.out.println(element.getElementsByTagName("NO").item(0).getTextContent());
System.out.println(element.getElementsByTagName("NAME").item(0).getTextContent());
}
输出:
1
John Doe
2
Jane Doe
推荐阅读
- rxjs - Angular 6 多个 HTTP 请求 RxJs
- javascript - 从外部网页获取文本和图像
- django - Django + React Native。如何从 React Native 向 Django 输入数据?
- json - 将 json 对象从反应前端传递到 rails api 时出错
- dart - 为什么“使用不包含导航器的上下文请求导航器操作”
- python-3.x - sklearn 的 roc_auc_score 用作指标时如何找到错误率?
- reactjs - “textTransform”不是有效的样式属性,即使它说它在文档中?
- javascript - 复选框选择
- html - 在将鼠标悬停在其父级的父级标签上时使伪元素移动
- python - 将函数应用于列表列表中的每个底部元素