0

我正在使用 Spark XML 解析包含一些用户定义实体的大型文档。这是文件中的一个简单片段

<JMdict>
    <entry>
        <ent_seq>1000000</ent_seq>
        <r_ele>
            <reb>ヽ&lt;/reb>
        </r_ele>
        <sense>
            <pos>&unc;</pos>
            <gloss g_type="expl">repetition mark in katakana</gloss>
        </sense>
        <sense>
            <gloss xml:lang="dut">hitotsuten 一つ点: teken dat herhaling van het voorafgaande katakana-schriftteken aangeeft</gloss>
        </sense>
    </entry>
</JMdict>

可以在 XML 文档中找到的内联 DTD 中正确定义了实体,例如这里

<!ENTITY unc "unclassified">

但是,在模式检测阶段解析失败......

root
 |-- _corrupt_record: string (nullable = true)

原因似乎是用户定义的实体:当我转义它们(例如&amp;unc;)时,一切都会再次运行。

root
 |-- ent_seq: string (nullable = true)
 |-- r_ele: struct (nullable = true)
 |    |-- reb: string (nullable = true)
 |-- sense: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- gloss: struct (nullable = true)
 |    |    |    |-- _VALUE: string (nullable = true)
 |    |    |    |-- _g_type: string (nullable = true)
 |    |    |    |-- _lang: string (nullable = true)
 |    |    |-- pos: string (nullable = true)

我该如何解决这个问题?

4

1 回答 1

0

是的,它不会做诸如读取 ENTITY 指令之类的事情。原因是你真的不能在大量的 XML 中抛出一个常规的 XML 解析器——或者如果你可以,那么,不需要 Spark,或者spark-xml真的不需要。

所做的只是“spark-xml解析” XML 以找到您感兴趣的少数几个子集,然后将其传递给成熟的 XML 解析器 (STaX)。因此,在您的行标记中,应该正确解析 XML。但是 ENTITY 将位于文档的根目录,因此 STaX 不会看到它。

事实上,这里的用例甚至不是一个大文档,而是很多,甚至可能有不同的指令。

于 2020-08-31T18:55:49.270 回答