JAVA如何查找和删除句子结构?

标签 java xml parsing

我有一个xml文件,它的结构是这样的。

 <?xml version="1.0" encoding="MS949"?> 
 <pmd-cpd>
    <duplication lines="123" tokens"123"> 
        <file line="1" path="..">
        <file line="1" path="..">
        <codefragment><![CDATA[........]]></codefragment>
    </duplication>
    <duplication>
    ...
    </duplication>
 </pmd-cpd>

我想删除“codefragment”节点,因为我的解析器出错“无效的 XML 字符(0x1)”。 '

我的解析代码是这样的,

private void parseXML(File f){
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = null;
      Document document = null;
    try {
        builder = factory.newDocumentBuilder();
        document = builder.parse(f);
     }catch(...)

错误发生在 document = builder.parse(f); 中,因此我无法使用解析器删除 codefragment 节点。

这就是为什么我想在没有解析器的情况下删除这些行。

如何在没有解析器的情况下删除此节点...?

最佳答案

这是对OP self 回答的后续回答,以及我对该回答的评论。这是回顾,加上一些额外的内容:

  • 切勿在循环中执行String += String。使用StringBuilder
  • 以 block 而非行的形式读取 XML。
  • 不要使用String.replaceAll()。它必须每次都重新编译正则表达式,这是您已经拥有的正则表达式。使用 Matcher.replaceAll()
  • 请记住close() Reader。更好的是,使用try-with-resources
  • 无需将干净的 XML 保存回来,直接使用即可。
  • 由于 XML通常采用 UTF-8 格式,因此请以 UTF-8 格式读取文件。
  • 不要打印并忽略错误。让调用者处理错误。
private static void parseXML(File f) throws IOException, ParserConfigurationException, SAXException {
    StringBuilder xml = new StringBuilder();
    try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(f),
                                                                      StandardCharsets.UTF_8))) {
        Pattern badChars = Pattern.compile("[^\\u0009\\u000a\\u000d\\u0020-\\uD7FF\\uE000-\\uFFFD]+");
        char[] cbuf = new char[1024];
        for (int len; (len = in.read(cbuf)) != -1; )
            xml.append(badChars.matcher(CharBuffer.wrap(cbuf, 0, len)).replaceAll(""));
    }
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder domBuilder = domFactory.newDocumentBuilder();
    Document document = domBuilder.parse(new InputSource(new StringReader(xml.toString())));
    // insert code using DOM here
}

关于JAVA如何查找和删除句子结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33953177/

相关文章:

java - 自定义 LogBack 附加程序失败并出现 java.lang.ClassNotFoundException

java - JTable 标题未显示在 JScrollPane 中

xml - 我们必须为模板标签中的匹配赋予什么值?

android - 在 Linux 中解析 build.prop

Java - 正则表达式有效条目

java - JDK9 NetBeans Dev - JNI 教程期间编译错误

java - 使用 GWT 的 GET 请求检索 XML 数据?

html - 为什么 XPath contains(text() ,'substring' ) 没有按预期工作?

java - 如何解析 WSDL 文件以提取特定节点的内容

java - 从文本文件读取数据,比较行并以首选格式显示