Xpath - как получить все имена атрибутов и значения элемента
я использую xpath в java. Я хочу получить все атрибуты (имя и значение) элемента. Я нашел запрос для получения значений атрибутов элемента, теперь я хочу получить только имена атрибутов или имена и значения в одном запросе.
<Element1 ID="a123" attr1="value1" attr2="value2" attr3="value3" attr4="value4" attr5="value5" />
здесь, используя следующий запрос, чтобы получить все значения атрибутов Element1
XmlUtils.getAttributes(Path, String.format("//*/@*"));
Используя этот формат //*/@*
Я могу получить значения. результат будет value1 value2 value3 value4 value5 a123
теперь я хочу знать запрос, чтобы получить весь атрибут имена или запрос, чтобы получить все атрибуты name и value.
2 ответов
чтобы выбрать все атрибуты всех элементов в документе с именем Element1://Element1/@*
. Это вернет nodeset содержащих атрибут узлы. Затем можно выполнить итерацию набора nodeset.
если у вас уже есть контекстный узел и вы хотите найти результаты под ним, запрос будет .//Element1/@*
. Это обычно более эффективно, чем запрос всего документа.
// input is an InputSource or a DOM node
NodeList nl = (NodeList) xpath.evaluate("//Element1/@*", input, XPathConstants.NODESET);
int length = nl.getLength();
for( int i=0; i<length; i++) {
Attr attr = (Attr) nl.item(i);
String name = attr.getName();
String value = attr.getValue();
}
и может быть более эффективным найти все элементы данного имени, используя getElementsByTagName.
NodeList nl = document.getElementsByTagName("Element1");
чтобы получить атрибуты определенного элемента, повторите его атрибуты собственность.
NamedNodeMap nl = element.getAttributes();
int length = nl.getLength();
for( int i=0; i<length; i++) {
Attr attr = (Attr) nl.item(i);
String name = attr.getName();
String value = attr.getValue();
}
Я должен был сделать это в служебной шине Oracle и должен был использовать только xPath для создания ключа кэша, и решение, которое работает для меня, было:
concat(
string-join(//*[string-length(normalize-space(string-join(text(), ''))) > 0]/concat(local-name(),
':',
normalize-space(string-join(text(), ''))), '_'),
'_',
string-join(//@*[normalize-space(.) != '']/concat(name(), ':', .), '_')
)