当我尝试从XML文件中读取注释时,两个元素的注释都会打印两次,当它通过循环时。它应该在第一次迭代中打印第一元素注释,在下一次迭代中打印第二元素注释。如果不清楚,我附上了预期产出和实际产出,以供参考。
XML代码:
<shipments>
<shipment id="011">
<department>XXXX</department>
<!-- Product: XXXXX-->
</shipment>
</shipments>
代码:
public class Main {
public static void main(String[] args) throws SAXException,
IOException, ParserConfigurationException, XMLStreamException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// Ignores all the comments described in the XML File
factory.setIgnoringComments(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("Details.xml"));
doc.getDocumentElement().normalize();
NodeList ShipmentList = doc.getElementsByTagName("shipment");
for (int i = 0; i < ShipmentList.getLength(); i++)
{
Node node = ShipmentList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement = (Element) node;
XMLStreamReader xr = XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream("shipmentDetails_1.xml"));
while (xr.hasNext()) {
if (xr.next() == XMLStreamConstants.COMMENT) {
String comment = xr.getText();
System.out.print("Comments: ");
System.out.println(comment);
} }
}
}
}
}
预期输出:
评论:产品:笔记本电脑
点评:产品:手机
输出我得到的内容:
评论:产品:笔记本电脑
点评:产品:手机
评论:产品:笔记本电脑
点评:产品:手机
发布于 2019-06-10 19:48:36
要从XML声明中获取值,请调用Document
上的以下方法
getXmlEncoding()
-一个属性,作为XML声明的一部分,指定该文档的编码。当未指定或不知道时,这是null
,例如在内存中创建Document
时。getXmlStandalone()
-一个属性,作为XML声明的一部分,指定该文档是否是独立的。这是未指定的false
。getXmlVersion()
-一个属性,作为XML声明的一部分,指定此文档的版本号。如果没有声明,并且该文档支持"XML“特性,则值为"1.0"
。更新
若要在<shipment>
元素中查找和打印注释,请迭代元素的子节点并查找COMMENT_NODE
类型的节点,将其转换为Comment
,并打印getData()
的值。
for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
if (child.getNodeType() == Node.COMMENT_NODE) {
Comment comment = (Comment) child;
System.out.println("COMMENTS : " + comment.getData());
}
}
要澄清的是:这里使用的node
来自问题代码。您还可以使用eElement
而不是node
。没什么区别。
发布于 2019-06-10 18:56:22
为了获得XML声明和注释,我建议将文件作为文本文件加载并通过正则表达式进行解析。例如:
String file = new String(Files.readAllBytes(Paths.get("shipmentDetails_1.xml")), StandardCharsets.UTF_8);
Pattern pattern = Pattern.compile("<!--([\\s\\S]*?)-->");
Matcher matcher = pattern.matcher(file);
while (matcher.find()) {
System.out.println("COMMENTS: " + matcher.group(1));
}
Pattern pattern2 = Pattern.compile("<\\?xml([\\s\\S]*?)\\?>");
Matcher matcher2 = pattern2.matcher(file);
while (matcher2.find()) {
System.out.println("DECLARATION: " + matcher2.group(1));
}
https://stackoverflow.com/questions/56531665
复制相似问题