Найти элементы в Node без надлежащего пространства имен, в Java
Итак, у меня есть документ xml, который я здесь заявил:
DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder();
StringReader reader = new StringReader(s);
InputSource inputSource = new InputSource(reader);
doc_ = dBuilder.parse(inputSource);
Затем у меня есть функция, в которой я передаю строку, и я хочу сопоставить ее с элементом в моем XML:
void foo(String str)
{
NodeList nodelist = doc_.getDocumentElement().getElementsByTagName(str);
}
Проблема в том, что при входе str
в нем нет никакого пространства имен, поэтому xml, который я тестировал, будет:
<Random>
<tns:node />
</Random>
а str
будет node. Итак, nodelist теперь null, потому что он ожидает tns: node, но я прошел через node. И я знаю, что нехорошо игнорировать пространство имен, но в этом случае это прекрасно. Моя проблема в том, что я не знаю, как искать элемент Node для элемента, игнорируя пространство имен. Я также думал о добавлении пространства имен к str, который приходит, но я не знаю, как это сделать.
Любая помощь будет принята с благодарностью,
Спасибо, -Josh
Ответы
Ответ 1
Чтобы соответствовать всем узлам, имя которых является "str", независимо от пространства имен, используйте следующее:
NodeList nodes = doc.getDocumentElement().getElementsByTagNameNS("*", str);
Подстановочный знак "*" будет соответствовать любому пространству имен. См. Element.getElementsByTagNameNS(...).
Изменить: кроме того, как @Wheezil правильно указал в комментарии, вы должны вызвать DocumentBuilderFactory.setNamespaceAware(true)
для этого, чтобы работать, иначе пространства имен не будут обнаружены.
Ответ 2
Самое простое решение - добавить свой собственный root node с помощью строковой манипуляции
DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder();
s = "<root xmlns:tns=\"MyNamespace\">" + s + "</root>";
StringReader reader = new StringReader(s);
InputSource inputSource = new InputSource(reader);
doc_ = dBuilder.parse(inputSource);