我需要从xml文档中删除所有xml标记,但保留标记占用的空间,以便文本内容保持与xml中相同的偏移量。这需要用Java完成,我认为RegExp是可行的方法,但我找不到简单的方法来获得与我的正则表达式匹配的标签的长度。
基本上我想要的是:
Pattern p = Pattern.compile("<[^>]+>[^<]*]+>");
Matcher m = p.matcher(stringWithXMLContent);
String strippedContent = m.replaceAll("THIS IS A STRING OF WHITESPACES IN THE LENGTH OF THE MATCHED TAG");
希望有人能帮助我以简单的方式做到这一点!
答案 0 :(得分:4)
由于<
和>
字符始终围绕XML中的起始和结束标记,因此使用简单的状态机可能会更简单。只需循环遍历所有字符(以某种可写形式 - 不存储在字符串中),如果在“替换模式”上遇到<
翻转并开始用空格替换所有字符,直到遇到{{1} }。 (请务必同时替换初始>
和结束<
)。
如果您关心布局,可能希望避免替换制表符和/或换行符。如果您关心的是整个字符串长度,那显然无关紧要。
编辑:如果您想支持评论,处理说明和/或CData部分,您还需要明确地识别这些内容;此外,遗憾的是,属性值也可以包含>
;所有这些意味着一个完整的实现将更加复杂,你想要。
常规换能器非常适合这项任务;但不幸的是,这些在类库中并不常见......
答案 1 :(得分:1)
Pattern p = Pattern.compile("<[^>]+>[^<]*]+>");
本着“无法使用Regexp解析XML”的精神,您知道对于任意XML来说,这不是一个合适的模式,对吧? (在属性值中包含&gt;字符是完全有效的,例如,更不用说其他非标记结构。)
我找不到简单的方法来获得与我的正则表达式匹配的标签的长度。
不要使用replaceAll,而是在Matcher上重复调用find。然后,您可以读取开始/结束以获取要替换的索引,或者在缓冲区上使用appendReplacement方法。例如
StringBuffer b= new StringBuffer();
while (m.find()) {
String spaces= StringUtils.repeat(" ", m.end()-m.start());
m.appendReplacement(b, spaces);
}
m.appendTail(b);
stringWithXMLContent= b.toString();
(StringUtils来自Apache Commons。有关更多背景和无库的替代方案,请参阅this question。)
答案 2 :(得分:1)
为什么不使用xml pull解析器,只需回显你想要保留的所有内容,例如:字符内容以及每当到达开始或结束标记时,使用元素的名称以及它具有的任何属性来查找长度,并写入适当数量的空格。
SAX API还具有可忽略空白的回调。因此,您还可以回显文档中出现的所有空格。
答案 3 :(得分:0)
也许m.start()和m.end()可以提供帮助。
m.start()=&gt; “匹配的第一个字符的索引” m.end()=&gt; “最后一个字符匹配后的偏移”
(m.end() - m.start()) - 2你知道你需要多少人。
答案 4 :(得分:0)
**string**.replaceAll("(</?[a-zA-Z]{1}>)*", "")
你也可以试试这个。它搜索&lt;,然后/ 0或1出现,然后是字符仅1(小或大写字母),然后是&gt; ,然后*多次出现这种模式。
:)