如果 sgml 中有特定标签,则使用 java 删除 sgml 中的父标签
Remove the parent tag in sgml using java if it has the specific tag inside it
我想删除父标签,如果标签中只有注释标签。
示例:
输入:
<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 如果它只有注释标签,并且如果它有一些其他标签或带有其他不应删除的标签的注释标签。
您可以在此处使用 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>
(...)
我想删除父标签,如果标签中只有注释标签。
示例:
输入:
<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 如果它只有注释标签,并且如果它有一些其他标签或带有其他不应删除的标签的注释标签。
您可以在此处使用 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>
(...)