java - 使用 java 删除 sgml 中的父标签(如果其中包含特定标签)

标签 java regex parsing sgml

如果标签中只有注释标签,我想删除父标签。

示例:

输入:

<data>
<subdata>
<l1item>
    <note>
        <para>hello
        </para>
    </note>
</l1item>
</subdata>
<subdata>
<l2item>
    <para> dont delete 
    </para>
</l2item>
<l3item>
    <note>
        <para>hello
        </para>
    </note>
    <para> dont delete 
    </para>
</l3item>
</subdata>
</data>

预期输出:

<data>
<subdata>
<note>
<para>hello
</para>
</note>
</subdata>
<subdata>
<l2item>
<para> dont delete 
</para>
</l2item>
<l3item>
    <note>
        <para>hello
        </para>
    </note>
    <para> dont delete 
    </para>
</l3item>
</subdata>
</data>

在上面的例子中,l1item 标签被删除,因为它只有 note 标签,l2item 没有被删除,因为它有 para 标签,l3item 没有被删除,因为它有 note 标签和 para 标签

所以我的要求是,如果 l1item 或 l2item 或 l3item 中只有 note 标签,并且它有其他标签或带有其他不应删除的标签的 note 标签,我想删除它。

最佳答案

您可以在此处使用 Jsoup,尽管它主要不是 SGML 解析器。

我们正在寻找作为其各自父级的唯一子级的 note 元素。这可以翻译为:

note:only-child

当我们发现其中一个笔记时,我们可以找到它的父笔记,并用找到的笔记替换这个父笔记。我们将使用Node::replaceWith方法:

foundNote.parent().replaceWith(foundNote);

让我们将所有内容放在下面的示例代码中:

示例代码

String sgml = "<data>\n<subdata>\n<l1item>\n    <note>\n        <para>hello\n        </para>\n    </note>\n</l1item>\n</subdata>\n<subdata>\n<l2item>\n    <para> dont delete \n    </para>\n</l2item>\n<l3item>\n    <note>\n        <para>hello\n        </para>\n    </note>\n    <para> dont delete \n    </para>\n</l3item>\n</subdata>\n</data>";

Document doc = Parser.xmlParser().parseInput(sgml, "");

System.out.println("BEFORE:\n" + doc.html());

Elements onlyChildNotes = doc.select("note:only-child");

for (Element note : onlyChildNotes) {
    Element noteParent = note.parent();
    if (noteParent != null) {
        noteParent.replaceWith(note);
    }
}

System.out.println("AFTER:\n" + doc.html());

输出

BEFORE:
<data> 
 <subdata> 
  <l1item> 
   <note> 
    <para>
     hello 
    </para> 
   </note> 
  </l1item>
 </subdata>
  (...)

AFTER:
<data> 
 <subdata> 
  <note> 
   <para>
    hello 
   </para> 
  </note> 
 </subdata> 
 (...)

关于java - 使用 java 删除 sgml 中的父标签(如果其中包含特定标签),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869296/

相关文章:

c# - 解析固定列宽的可变长度字符串 C#

java - 使用 JavaFX 8 执行显示 FXML 的操作

java - 如何强制 Java 接受方法调用的参数之一的条件类型?

java - Spring MVC中如何集成多种 View 技术

正则表达式删除 <> 之间的所有内容

android - 从 ListView 中单击的 Firebase 元素中检索信息

java - 如何通过 LDAP 将 userWorkstation 传递到 Active Directory 进行登录?

c# - 正则表达式验证属性无法正常工作

python - 将 "340"类型转换为 int 会导致 '34' 丢失最后一个零

parsing - 用于解析 SMTP 日志以查找退回邮件的工具