Как заменить текст в XML-документе с помощью Java

#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