Regex для замены содержимого xml java

Мне нужно заменить содержимое xml пустой строкой.

  <credential location = "PropertyFileInventoryProvider" name = "CLI_SESSION_PARENT_SCRIPT">&lt;cliSession xmlns = "http://example.com/cfr2" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" formatVersion = "1" xsi:schemaLocation = "http://example.com/cfr2 xdeCliSessionScript.xsd"&gt;
    &lt;/cliSession&gt;</credential>

Я создаю следующее регулярное выражение, но не работает.

val.replaceAll("<credential location=\"PropertyFileInventoryProvider\" name=\"CLI_SESSION_PARENT_SCRIPT\">[\\s\\S]*?</credential>", "");

может быть val = val.replaceAll("<credential ....");

YCF_L 23.07.2018 20:11

Вы не забыли назначить результат вашего звонка replaceAll? Помните, что это возвращается измененная строка, но не изменяет саму строку ввода.

Roddy of the Frozen Peas 23.07.2018 20:12

У меня есть несколько тегов учетных данных, и мне нужно удалить только тот, который имеет содержимое как CLI_SESSION_PARENT_SCRIPT.

mohan 23.07.2018 20:13

Что вам нужно заменить из этого xml?

Paolo 23.07.2018 20:19

Необходимо заменить тег xml пустой строкой .eg: ""

mohan 23.07.2018 20:25

XML - это не текст «по-настоящему». Разбор-изменение-перезапись - правильный способ изменить его части. Магия на основе строк умрет, если появятся новые атрибуты или будут переупорядочены только существующие.

tevemadar 23.07.2018 20:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
6
1 226
2

Ответы 2

  • Использование регулярных выражений для обработки XML - это плохая идея. Он не совместим с продвижением вперед. Ваша программа просто ждет неудачи в будущем. Существует слишком много вариантов написания XML семантически идентичным способом, которые слишком сложно уловить с помощью регулярного выражения. Например, значения атрибутов могут быть заключены в апострофы вместо кавычек. Последовательность атрибутов может отличаться. Количество и тип пробелов до или после атрибутов могут различаться. Перед или после знака равенства значений атрибутов может быть пробел. Могут быть введены объявления пространств имен. Могут быть введены атрибуты XML или других пространств имен. Комментарии могут быть вставлены. Когда программа, которая создает указанный выше XML-файл, немного изменяется и последовательность атрибутов изменяется, результирующий XML становится семантически идентичным, но ваше регулярное выражение нарушается.
  • Ваше регулярное выражение можно упростить до [^<] вместо [\\s\\S], потому что [\\s\\S] на самом деле является ., но вы можете исключить <.
  • Вы не присваиваете значение. Помните, что в Java String неизменен. Чтобы получить заменяемую строку, вам нужно присвоить возвращаемое значение. Так что, наверное, val = val.replaceAll(...).

Таким образом, ваш код Java, вероятно, должен быть:

val = val.replaceAll("<credential location=\"PropertyFileInventoryProvider\" name=\"CLI_SESSION_PARENT_SCRIPT\">[^<]*?</credential>", "");

Вы можете добиться аналогичных результатов с помощью XSLT и XPath или DOM и XPath гораздо более надежным способом. Например, вы можете удалить все узлы, соответствующие credential[@location = "PropertyFileInventoryProvider"][@name = "CLI_SESSION_PARENT_SCRIPT"].

Это сделает следующий XSLT:

<xsl:transform version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
    <xsl:template
        match='
            credential
                [@location = "PropertyFileInventoryProvider"] 
                [@name = "CLI_SESSION_PARENT_SCRIPT"]
        '
    />
    <xsl:template match = "@*|node()">
        <xsl:copy>
            <xsl:apply-templates select = "@*|node()"/>
        </xsl:copy>
    </xsl:template>
<xsl:transform>

Я пробовал как val = val.replaceAll ("<учетные данные [a-zA-Z \\ = \" + A-Za-z \\ s + az \\ = \ "CLI_SESSION_PARENT_SCRIPT \">] ‌ [^ <] *? </credential> "‌," "); но не повезло

mohan 23.07.2018 20:39

Теперь этот RE, который вы только что дали, определенно не может работать. Пожалуйста, прочтите документацию Pattern. docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.h‌ tml

Christian Hujer 23.07.2018 20:46

Даже это не сработало. val = val.replaceAll ("<credential location = \" PropertyFileInventoryProvider \ "name = \" CLI_SESSION_PARENT_SCRIPT \ "> [^ <] *? </credential>", "");

mohan 23.07.2018 20:47

Для вашего тега Credentials это должно работать:

import org.apache.commons.lang3.StringUtils;

class Demo {
    public static void main(String args[]) {
        String temp = "<credential location=\"PropertyFileInventoryProvider\" name=\"CLI_SESSION_PARENT_SCRIPT\">&lt;cliSession xmlns=\"http://example.com/cfr2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" formatVersion=\"1\" xsi:schemaLocation=\"http://example.com/cfr2 xdeCliSessionScript.xsd\"&gt;\r\n" + 
                "    &lt;/cliSession&gt;</credential>";
        String newString = StringUtils.substringBetween(temp, "credential");
        String emptyCredTag = temp.replaceAll(newString, "");
        temp = emptyCredTag.replaceAll(emptyCredTag, "");
        System.out.println(temp);
    }   
}

Добавьте эту зависимость в свой проект:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.0</version>
</dependency>

Это поможет вам до некоторой степени, но для всех тегов Credential вы должны найти логику, которая будет реализована с использованием этого класса StringUtils, т.е. вы должны найти способ перебора всех тегов, а затем использовать метод StringUtils.substringBetween () .

Для вашего фрагмента XML он определенно будет работать .
Надеюсь, это вам поможет.

val = val.replaceAll ("<учетные данные [^>] + CLI_SESSION_PARENT_SCRIPT [^> ‌] +> [^ <] + </ credential‌>", "<credential name = \" CLI_SESSION_PARENT_SCRIPT \ "> cliSession </ credential > ");

mohan 24.07.2018 19:21

Другие вопросы по теме