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