Мне нужно заменить содержимое xml пустой строкой.
<credential location = "PropertyFileInventoryProvider" name = "CLI_SESSION_PARENT_SCRIPT"><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">
</cliSession></credential>
Я создаю следующее регулярное выражение, но не работает.
val.replaceAll("<credential location=\"PropertyFileInventoryProvider\" name=\"CLI_SESSION_PARENT_SCRIPT\">[\\s\\S]*?</credential>", "");
Вы не забыли назначить результат вашего звонка replaceAll? Помните, что это возвращается измененная строка, но не изменяет саму строку ввода.
У меня есть несколько тегов учетных данных, и мне нужно удалить только тот, который имеет содержимое как CLI_SESSION_PARENT_SCRIPT.
Что вам нужно заменить из этого xml?
Необходимо заменить тег xml пустой строкой .eg: ""
XML - это не текст «по-настоящему». Разбор-изменение-перезапись - правильный способ изменить его части. Магия на основе строк умрет, если появятся новые атрибуты или будут переупорядочены только существующие.




[^<] вместо [\\s\\S], потому что [\\s\\S] на самом деле является ., но вы можете исключить <.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> "," "); но не повезло
Теперь этот RE, который вы только что дали, определенно не может работать. Пожалуйста, прочтите документацию Pattern. docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.h tml
Даже это не сработало. val = val.replaceAll ("<credential location = \" PropertyFileInventoryProvider \ "name = \" CLI_SESSION_PARENT_SCRIPT \ "> [^ <] *? </credential>", "");
Для вашего тега 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\"><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\">\r\n" +
" </cliSession></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 > ");
может быть
val = val.replaceAll("<credential ....");