【问题标题】:Parser CDATA xml解析器 CDATA xml
【发布时间】:2021-12-15 19:23:48
【问题描述】:

[CDATA] 中有一个带有嵌入式 XML 的 XML,知道我们如何解析该 xml?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
    <b>
        <c>
            <![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?><bigXML>]]>
        </c>
    </b>
</a>

我不能在c 的值上使用正则表达式/替换,因为嵌入的 XML 是 250mb 大小的 xml,如果我尝试使用这些运算符中的 ant,我得到了 Java Heap Out of memory

【问题讨论】:

标签: java xml xml-parsing


【解决方案1】:

您可以尝试使用Jsoup。 Jsoup 实际上是一个 html 解析器,但也能够解析 xml。它非常直观,一旦您熟悉了selector syntax,它就非常易于使用。您可以将 cdata 的内容解析为 CDataNode 并使用内置方法来获取您需要的内容。

Maven 依赖:

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.14.3</version>
</dependency>

修改了上面给出的非常简化的 xml 以提供一个示例:

import org.jsoup.Jsoup;
import org.jsoup.nodes.CDataNode;
import org.jsoup.nodes.Document;
import org.jsoup.parser.Parser;
import org.jsoup.select.Elements;

public class TestJavaClass {

    public static void main(String[] args) {
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
                + "<axx>\n"
                + "    <bxx>\n"
                + "        <cxx>\n"
                + "            <![CDATA["
                + "                     <?xml version=\"1.0\"?>\n"
                + "                         <catalog>\n"
                + "                             <book id=\"bk101\">\n"
                + "                                 <author>Gambardella, Matthew</author>\n"
                + "                                 <title>XML Developer's Guide</title>\n"
                + "                                 <genre>Computer</genre>\n"
                + "                                 <price>44.95</price>\n"
                + "                                 <publish_date>2000-10-01</publish_date>\n"
                + "                                 <description>An in-depth look at creating applications \n"
                + "                                 with XML.</description>\n"
                + "                             </book>\n"
                + "                             <book id=\"bk102\">\n"
                + "                                 <author>Ralls, Kim</author>\n"
                + "                                 <title>Midnight Rain</title>\n"
                + "                                 <genre>Fantasy</genre>\n"
                + "                                 <price>5.95</price>\n"
                + "                                 <publish_date>2000-12-16</publish_date>\n"
                + "                                 <description>A former architect battles corporate zombies, \n"
                + "                                 an evil sorceress, and her own childhood to become queen \n"
                + "                                 of the world.</description>\n"
                + "                             </book>"
                + "                         </catalog>"
                + "                 ]]>\n"
                + "        </cxx>\n"
                + "    </bxx>\n"
                + "</axx>\n";

        Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
        CDataNode cdata = (CDataNode) doc.selectFirst("cxx").childNode(1);

        Document cdataDoc = Jsoup.parse(cdata.text(),"", Parser.xmlParser());
        Elements authors = cdataDoc.select("book author");
        authors.forEach(aut -> {
            System.out.println(aut.text());
        });
    }
}

输出:

Gambardella, Matthew
Ralls, Kim

编辑

处理大文件可能会导致 OOM 异常。我还没有尝试过,但是acording to this post Jsoup 有一个实现的流阅读器来处理大文件。如果您遇到内存不足错误,请尝试接受 InputStream 的 overloded parse 方法:

public static org.jsoup.nodes.Document parse(@Nullable java.io.InputStream in,
                                         String charsetName,
                                         String baseUri,
                                         org.jsoup.parser.Parser parser)

所以在上述情况下是这样的:

InputStream in = new FileInputStream(new File("path to your xml file"));
Document doc = Jsoup.parse(in, "UTF-8", "", Parser.xmlParser());
....

【讨论】:

  • cdata xml 引用错误(250mb) 可能我还需要使用 VDT 或任何其他流式 xml 解析器。你知道那个 Jsoup 是在 Streaming 中工作还是将整个文件加载到内存中?
  • @paul 如果有帮助,请查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2012-01-19
  • 2011-01-09
  • 2011-07-06
  • 2011-11-13
相关资源
最近更新 更多