【发布时间】:2018-02-08 23:07:01
【问题描述】:
我正在通过this 链接将 sgml 内容转换为 xml 内容。
使用sgmlString.replaceAll("<(([^<>]+?)>)([^<>]+?)(?=<(?!\\1))", "<$1$3</$2>");正则表达式我几乎接近预期的结果,但是对于以下文件,当有多个同名的并行标签没有关闭时,它只关闭最后一个标签的标签。
输入:
<SEC-HEADER>0001104659-17-052330.hdr.sgml : 20170817
<ACCEPTANCE-DATETIME>20170817060417
<ACCESSION-NUMBER>0001104659-17-052330
<TYPE>8-K
<PUBLIC-DOCUMENT-COUNT>4
<PERIOD>20170816
<ITEMS>7.01
<ITEMS>8.16
<FILING-DATE>20170817
<DATE-OF-FILING-DATE-CHANGE>20170817
<FILER>
bye bye see you!
</FILER>
</SEC-HEADER>
输出:(注意只有一个ITEMS标签的关闭和两个FILER的关闭,不是预期的)
<SEC-HEADER>0001104659-17-052330.hdr.sgml : 20170817
<ACCEPTANCE-DATETIME>20170817060417</ACCEPTANCE-DATETIME>
<ACCESSION-NUMBER>0001104659-17-052330</ACCESSION-NUMBER>
<TYPE>8-K</TYPE>
<PUBLIC-DOCUMENT-COUNT>4</PUBLIC-DOCUMENT-COUNT>
<PERIOD>20170816</PERIOD>
<ITEMS>7.01<ITEMS>8.16</ITEMS>
<FILING-DATE>20170817</FILING-DATE>
<DATE-OF-FILING-DATE-CHANGE>20170817</DATE-OF-FILING-DATE-CHANGE>
<FILER>bye bye see you!</FILER></FILER>
</SEC-HEADER>
预期:
<SEC-HEADER>0001104659-17-052330.hdr.sgml : 20170817
<ACCEPTANCE-DATETIME>20170817060417</ACCEPTANCE-DATETIME>
<ACCESSION-NUMBER>0001104659-17-052330</ACCESSION-NUMBER>
<TYPE>8-K</TYPE>
<PUBLIC-DOCUMENT-COUNT>4</PUBLIC-DOCUMENT-COUNT>
<PERIOD>20170816</PERIOD>
<ITEMS>7.01</ITEMS>
<ITEMS>8.16</ITEMS>
<FILING-DATE>20170817</FILING-DATE>
<DATE-OF-FILING-DATE-CHANGE>20170817</DATE-OF-FILING-DATE-CHANGE>
<FILER>bye bye see you!</FILER>
</SEC-HEADER>
我需要您对以下问题的建议/指导:
- 因为我读的正则表达式很慢,所以使用正则表达式获取结束标签以使其成为 xml 格式是一种好方法吗?
- 我有很多文件要处理(最多 18000 行/标签),有没有更好的方法来实现它?
- 如何通过改变正则表达式得到预期的结果(我的EL真的很弱)
【问题讨论】:
-
我是否可以建议您考虑使用 XSLT,据我了解,它可能非常适合这个 XML 转换问题?我认为在这里使用正则表达式会引起问题,尤其是嵌套标签。
-
我不知道 XSLT 以及如何使用它。您能否提供一些指南/工作示例的链接或参考它的东西。感谢您的快速回复。
-
@TimBiegeleisen XSLT 不会因为任何还没有形成良好的东西而失败吗?
-
我对 sgml 没有经验,但是这
(?!\\1)不应该是(?!\\\1)以便 a) 转义的 `\` b) 对第一个匹配的引用吗? -
@Yunnosch 我对 sgml 和正则表达式也没有经验,我尝试了你的建议。它解决了ITEMS标签相关问题,但输出中仍然有两个FILER关闭。