Найти элементы в 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);