Java 如何将基于正则表达式匹配的XML更改为文本(字符数据)

Java 如何将基于正则表达式匹配的XML更改为文本(字符数据),java,xml,regex,jaxb,Java,Xml,Regex,Jaxb,我试图将XML文件的文本内容(字符数据)与一系列正则表达式相匹配,然后根据匹配项更改XML。例如: <text> <para>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </para> </text> 例如,对于每一场比赛,我想用标记或

我试图将XML文件的文本内容(字符数据)与一系列正则表达式相匹配,然后根据匹配项更改XML。例如:

 <text>
 <para>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
 </para>
 </text>
例如,对于每一场比赛,我想用标记或类似标记将比赛包围起来,这样上面的内容就变成:

<text>
<para>Lorem ipsum <bold>dolor<bold/> sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et <bold>dolore<bold/> magna aliqua.
</para>
</text>

知识产权是一种权利,是一种精英的权利,是劳动和财富的暂时性权利。
另一个复杂的问题是,我想要匹配的文本(字符数据)可能跨越多个标记

我想我正在尝试做的与文字处理器应用程序必须做的非常相似,如果你进行搜索,选择文本的匹配部分,然后例如更改匹配/选定文本的格式

我想使用Java(实际上是Clojure)来实现这一点,我打算使用JAXB来操作XML文档

如何执行上述操作?

编辑:

好了,现在我明白了这可以跨越标签,我想我明白了这里的困难

这里我能想到的唯一算法是遍历XML树,读取文本部分,搜索匹配项——您需要在多个节点上逐个字符进行匹配。当然,困难在于在这个过程中不要咀嚼这棵树

我会这样做:

创建一个步行器,步行到XML树。每当您认为已经找到字符串匹配的开头时,请保存当前父节点的内容。当(和如果)找到字符串匹配的结尾时,请检查保存的节点是否与结尾节点的父节点相同。如果它们相同,那么修改树是安全的

示例文档:

<doc>This is a an <b>example text I made up</b> on the spot! Nutty.</doc>
一旦您知道应该包含匹配项的节点在哪里,我不确定该怎么办,因为您不知道如何从正则表达式中找出文本中需要的索引。。。也许有人有一个正则表达式,你可以修改…

我认为“我想匹配的文本将跨越多个标记”的意思是这样的:

 In <i>this</i> example, I want to match "In this example".

 In <i><b>this</b></i> example, I also want to match "In this example".

 And <i>in <b>this</b></i> example, it's clear I have to ignore case too.
在本例中,我想匹配“在本例中”。
在本例中,我还想匹配“在本例中”。
在这个例子中,很明显我也必须忽略这个案例。
这似乎是一个特别困难的问题,因为您正在讨论的转换可能会导致XML格式不正确-例如,看看如果您尝试在子字符串周围放置标记会发生什么:

In this <i>example, putting tags around "in this example"</i> will break things.

<i>And in this</i> example, you have a similar problem.
在本例中,在“在本例中”周围放置标记将破坏一切。
在这个例子中,你有一个类似的问题。
要生成格式良好的输出,您可能需要如下所示:

<bold>In this <i>example</i><bold><i>, putting tags around "in this example"</i> will break things.

<i>And <bold>in this</bold></i><bold> example</bold>, you have a similar problem.
在本例中,在“在本例中”周围放置标记将破坏一切。
在这个例子中,你有一个类似的问题。
理论上,您匹配的每个角色都可能位于不同的元素中:

Almost like <i><u>i</u><u>n</u> </i><u>th</u>is<i><i><u> ex</i>am</i>ple.</i>
与本例中的几乎相同。
这里基本上有两个问题,都不简单:

  • 在XML流中搜索子字符串,忽略不是文本节点的所有内容,并返回子字符串在流中的开始和结束位置

  • 在XML文档中给定两个任意索引,创建一个元素,在这些索引之间封装文本,关闭(并重新打开)标记跨越两个索引之一但不同时跨越这两个索引的任何元素

  • 我很清楚,XSLT和正则表达式在这里帮不了你。我认为在这里使用DOM也帮不了你。事实上,我不认为第二个问题的答案不包括编写解析器


    我知道,这不是一个真正的答案。

    太好了,听起来你已经找到了答案。问题是什么?为什么不直接使用XLST呢?这正是它的设计初衷。试图用正则表达式解析XML会遇到很大的麻烦。Nick是对的:使用XSLT,然后将替换应用于元素的文本。@Nick:哪个版本的XSLT允许您处理文本内容?@gbacon:XSLT将使您获得元素的内容,但接下来呢?文本内容的实际处理是RegEx的工作。不过,我同意Ben的观点,这里没有问题。我的问题是,我要匹配的文本将跨越多个标记。提取文本并将其链接在一起并不是问题,找到匹配(ES)的开始和索引也不是,而是回到XML并在字符数据中间插入正确的起始标记和结束标记-谢谢。至少我知道我的问题是可以破译的:-)。我突然想到,这个操作非常类似于文字处理器应用程序必须执行的操作,如果您执行搜索,选择文本的匹配部分,然后例如更改匹配/选定文本的格式。
    <bold>In this <i>example</i><bold><i>, putting tags around "in this example"</i> will break things.
    
    <i>And <bold>in this</bold></i><bold> example</bold>, you have a similar problem.
    
    Almost like <i><u>i</u><u>n</u> </i><u>th</u>is<i><i><u> ex</i>am</i>ple.</i>