Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果sgml中包含特定的标记,请使用java删除该父标记_Java_Regex_Parsing_Sgml - Fatal编程技术网

如果sgml中包含特定的标记,请使用java删除该父标记

如果sgml中包含特定的标记,请使用java删除该父标记,java,regex,parsing,sgml,Java,Regex,Parsing,Sgml,如果父标记中只有note标记,我想删除该标记 例如: 输入: <data> <subdata> <l1item> <note> <para>hello </para> </note> </l1item> </subdata> <subdata> <l2item> <para> dont delete

如果父标记中只有note标记,我想删除该标记

例如:

输入:

<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解析器

我们正在寻找
注意
元素,它们是各自父元素的唯一子元素。这可以翻译为:

注:独生子女
当我们发现其中一个便笺时,我们可以找到它的父便笺并用找到的便笺替换该父便笺。我们将使用以下方法进行此操作:

foundNote.parent().replaceWith(foundNote);
让我们将所有这些放在下面的示例代码中:

示例代码
String sgml=“\n\n\n\n hello\n\n\n\n\n\n不删除\n\n\n\n hello\n\n\n\n\n不删除\n\n\n\n\n”;
Document doc=Parser.xmlParser().parseInput(sgml,“”);
System.out.println(“BEFORE:\n”+doc.html());
Elements only childnotes=doc.select(“注:独生子女”);
用于(要素注释:仅限儿童){
元素noteParent=note.parent();
如果(noteParent!=null){
noteParent.replacetwith(note);
}
}
System.out.println(“之后:\n”+doc.html());
输出
之前:
你好
(...)
之后:
你好
(...)

熟悉一下。Java的实现就是这个类。我查看了xslt,我认为如果唯一的note子元素存在,那么删除父元素会更困难。但是如果我用大写字母表示数据,它会自动解析为更低的值case@Karthick如果您需要有关“小写”问题的帮助,请发布一个新问题。我们可以用java正则表达式或其他东西做些什么吗?,因为jsoup更改了sgml格式
BEFORE:
<data> 
 <subdata> 
  <l1item> 
   <note> 
    <para>
     hello 
    </para> 
   </note> 
  </l1item>
 </subdata>
  (...)

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