1

我有以下字符串:

<table:table-cell table:style-name="Table2.A1" office:value-type="string">
   <text:p text:style-name="P32">
      <text:span text:style-name="T1">test description</text:span>
      <text:span text:style-name="T2"> </text:span>
      <text:span text:style-name="T1">17/07/2013</text:span>
      <text:span text:style-name="T2"> </text:span>
      <text:span text:style-name="T1">test</text:span>
      <text:span text:style-name="T2"> </text:span>
      <text:span text:style-name="T1">test</text:span>
      <text:span text:style-name="T3"></text:span>
      <text:span text:style-name="T1">test</text:span>
      <text:span text:style-name="T3">test <!-- end tag is missing -->
  </text:p>
</table:table-cell>

有没有办法找到未关闭的标签并插入它?

预期输出:

<table:table-cell table:style-name="Table2.A1" office:value-type="string">
   <text:p text:style-name="P32">
      <text:span text:style-name="T1">test description</text:span>
      <text:span text:style-name="T2"> </text:span>
      <text:span text:style-name="T1">17/07/2013</text:span>
      <text:span text:style-name="T2"> </text:span>
      <text:span text:style-name="T1">test</text:span>
      <text:span text:style-name="T2"> </text:span>
      <text:span text:style-name="T1">test</text:span>
      <text:span text:style-name="T3"></text:span>
      <text:span text:style-name="T1">test</text:span>
      <text:span text:style-name="T3">test</text:span>
  </text:p>
</table:table-cell>

提前致谢

4

2 回答 2

2

是的。这是很有可能的。

软件工程/数据结构中的基本问题。 使用 Stack维护标签并检查它们是否正确关闭。

  1. 输入开始标签后立即推送
  2. 输入结束标签后立即弹出它并与它进行比较以检查它是否正确关闭

我给出了基本的想法,这是解决问题的方法

于 2013-07-17T08:16:31.313 回答
1

一个非常简单且可行的解决方案是使用任何可用的宽松“html”SAXreaders:

  1. 标签汤,或
  2. HTML 整洁

我相信两者都提供(我确定 tagoup 确实提供)XmlReader 实现,它们在接受什么样的“残酷”“HTML”时非常宽容,并且它们总是会生成格式良好的 XML (XHTML)。例如,这就是您可以将 DOM4J 与 TagSoup 一起使用来“纠正”无效输入的方式。

    SAXReader reader = new SAXReader(
            org.ccil.cowan.tagsoup.Parser.class.getName());
    Document doc = reader.read(...);
    XMLWriter writer = new XMLWriter(System.out);
    writer.write(doc);

鉴于您的输入,它会产生:

<table:table-cell xmlns:table="urn:x-prefix:table" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:office="urn:x-prefix:office" table:style-name="Table2.A1" office:value-type="string">
   <text:p xmlns:text="urn:x-prefix:text" text:style-name="P32">
      <text:span text:style-name="T1">test description</text:span>
      <text:span text:style-name="T2"> </text:span>
      <text:span text:style-name="T1">17/07/2013</text:span>
      <text:span text:style-name="T2"> </text:span>
      <text:span text:style-name="T1">test</text:span>
      <text:span text:style-name="T2"> </text:span>
      <text:span text:style-name="T1">test</text:span>
      <text:span text:style-name="T3"></text:span>
      <text:span text:style-name="T1">test</text:span>
      <text:span text:style-name="T3">test <!-- end tag is missing -->
  </text:span></text:p>
</table:table-cell>
于 2013-07-17T20:50:11.110 回答