Java-эквивалент System.Xml.XmlNode.InnerXml

#java #.net

#java #.net

Вопрос:

Существует ли java-эквивалент .NET System.Xml.XmlNode.InnerXml ?

Мне нужно заменить некоторые слова в XML-документе.

Я не могу использовать Java org.w3c.dom.Node.setTextContent() , потому что это удаляет узлы XML.

Спасибо!

Источник:

 <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:

Вы могли бы взглянуть на jdom.

Что-то вроде document.getRootElement().getChild("ELEMENT1").setText("replacement text");

Вам нужно немного поработать над преобразованием документа в документ JDOM, но есть адаптеры, которые делают это довольно простым для вас. Или, если XML находится в файле, вы можете просто использовать класс JDOM Builder для создания DOM, которым вы хотите управлять. `

Комментарии:

1. Разве я не потерял бы дочерние элементы в ELEMENT1, если бы я это сделал?

2. Можете ли вы привести более конкретный пример? Мне трудно визуализировать XML, который вы пытаетесь изменить.

3. обновил вопрос примером. Проблема в том, что дочерние узлы теряются при использовании p.setTextContent()

Ответ №2:

Хорошо, я нашел решение.

Ключом к этому является то, что вы не хотите заменять текст фактического узла. На самом деле существует дочернее представление только текста. Я смог выполнить то, что мне было нужно, с помощью этого кода:

 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));
    }
}