Используйте RegExp для замены тегов XML пробелами (в длину тегов) - PullRequest
1 голос
/ 26 августа 2009

Мне нужно убрать все теги 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");

Надеюсь, кто-нибудь поможет мне сделать это простым способом!

Ответы [ 5 ]

4 голосов
/ 26 августа 2009

Поскольку символы < и > всегда окружают начальные и конечные теги в XML, это может быть проще с простой машиной состояний. Просто зациклите все символы (в некоторой доступной для записи форме - не хранится в строке), и если вы встретите переворот < в «режиме замены», начните заменять все символы пробелами, пока не встретите >. (Обязательно замените начальный < и закрывающий >).

Если вы заботитесь о макете, вы можете не заменять символы табуляции и / или символы новой строки. Если все, что вас волнует, это общая длина строки, это, очевидно, не имеет значения.

Редактировать: Если вы хотите поддерживать комментарии, инструкции по обработке и / или разделы CData, вам необходимо явно их распознать; Кроме того, значения атрибутов, к сожалению, также могут включать >; Все это означает, что полноценная реализация будет более сложной, чем вы хотели.

Для этой задачи идеально подойдет обычный преобразователь; но, к сожалению, их не всегда можно найти в библиотеках классов ...

1 голос
/ 26 августа 2009

Почему бы не использовать синтаксический анализатор XML и просто выводить на экран все, что вы хотите сохранить, например, например: содержание символа и всякий раз, когда вы достигаете начального или конечного тега, узнайте длину, используя имя элемента, а также любые его атрибуты и запишите соответствующее количество пробелов.

SAX API также имеет обратные вызовы для игнорируемых пробелов. Таким образом, вы также можете повторить все пробелы, которые встречаются в вашем документе.

1 голос
/ 26 августа 2009
Pattern p = Pattern.compile("<[^>]+>[^<]*]+>"); 

В духе «Вы не можете анализировать XML» С помощью Regexp вы знаете, что это не адекватный шаблон для произвольного XML, верно? (Вполне допустимо иметь символ> в значении атрибута, например, не говоря уже о других конструкциях без тегов.)

Я не нашел простого способа получить длину тегов, соответствующих моему регулярному выражению.

Вместо использования replaceAll, повторно вызывайте find в Matcher. Затем вы можете прочитать начало / конец, чтобы заменить индексы, или использовать метод 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. Дополнительные справочные и бесбиблиотечные альтернативы см. в этом вопросе .)

0 голосов
/ 24 августа 2013
**string**.replaceAll("(</?[a-zA-Z]{1}>)*", "")

Вы также можете попробовать это. он ищет <, затем / 0 или 1 вхождение, затем следуют только символы 1 (маленький или заглавный символ), затем следуют>, затем * для многократного вхождения этого шаблона.

:)

0 голосов
/ 27 августа 2009

Может быть, m.start () и m.end () могут помочь.

m.start () => "Индекс первого совпадения символа" m.end () => "Смещение после совпадения последнего символа"

(m.end () - m.start ()) - 2, и вы знаете, сколько вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...