首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用DOM解析器从XML读取注释

使用DOM解析器从XML读取注释
EN

Stack Overflow用户
提问于 2019-06-10 18:24:47
回答 2查看 1.6K关注 0票数 3

当我尝试从XML文件中读取注释时,两个元素的注释都会打印两次,当它通过循环时。它应该在第一次迭代中打印第一元素注释,在下一次迭代中打印第二元素注释。如果不清楚,我附上了预期产出和实际产出,以供参考。

XML代码:

代码语言:javascript
运行
复制
<shipments>
  <shipment id="011">
    <department>XXXX</department>
    <!--  Product: XXXXX-->
  </shipment>   
</shipments>

代码:

代码语言:javascript
运行
复制
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);

             } }


     }
    }
}

}

预期输出:

评论:产品:笔记本电脑

点评:产品:手机

输出我得到的内容:

评论:产品:笔记本电脑

点评:产品:手机

评论:产品:笔记本电脑

点评:产品:手机

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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()的值。

代码语言:javascript
运行
复制
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。没什么区别。

票数 1
EN

Stack Overflow用户

发布于 2019-06-10 18:56:22

为了获得XML声明和注释,我建议将文件作为文本文件加载并通过正则表达式进行解析。例如:

代码语言:javascript
运行
复制
    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));
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56531665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档