#java #xml
#java #xml
Вопрос:
Как мне заменить текст в XML-документе с помощью Java?
Источник:
<body>
<title>Home Owners Agreement</title>
<p>The <b>good</b> thing about a Home Owners Agreement is that...</p>
</body>
Желаемый результат:
<body>
<title>Home Owners Agreement</title>
<p>The <b>good</b> thing about a HOA is that...</p>
</body>
Я хочу, чтобы текст в <p>
тегах был заменен. Я попробовал следующее:
replaceText(string term, string replaceWith, org.w3c.dom.Node p){
p.setTextContent(p.getTextContent().replace(term, replaceWith));
}
Проблема с приведенным выше кодом заключается в том, что все дочерние узлы p
теряются.
Ответ №1:
Хорошо, я нашел решение.
Ключом к этому является то, что вы не хотите заменять текст фактического узла. На самом деле существует дочернее представление только текста. Я смог выполнить то, что мне было нужно, с помощью этого кода:
private static void replace(Node root){
if (root.getNodeType() == root.TEXT_NODE){
root.setTextContent(root.getTextContent().replace("Home Owners Agreement", "HMO"));
}
for (int i = 0; i < root.getChildNodes().getLength(); i ){
outputTextOfNode(root.getChildNodes().item(i));
}
}
Ответ №2:
Проблема здесь в том, что вы на самом деле хотите заменить node, а не только текст. Вы можете просмотреть дочерние элементы текущего узла и снова добавить их в новый узел. Затем замените узлы.
Но это требует много работы и очень чувствительно к вашей структуре документа. Например, если кто-то обернет ваш <p>
тег, div
вам придется изменить ваш синтаксический анализ.
Более того, этот подход очень неэффективен с точки зрения использования процессора и памяти: вам нужно разобрать весь документ, чтобы изменить в нем пару слов.
Мое предложение заключается в следующем: попробуйте использовать регулярные выражения. В большинстве случаев он достаточно сильный. Например, код, подобный
xml.replaceFirst("(<p>.*?</p>)", "<p>The <b>good</b> thing about a HOA is that...</p>")
будет работать (по крайней мере, в вашем случае).
Комментарии:
1. Спасибо. Регулярные выражения — это возможность, но мой пример упрощен из того, что я на самом деле должен делать. То, что я заменяю, зависит от множества вложенных элементов. Я смог довольно легко выполнить свои замены с помощью C #, заменив System.Xml.XmlNode . InnerXml