Xpath - Как получить все имена атрибутов и значения элемента - PullRequest
10 голосов
/ 17 марта 2010

Я использую 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

Теперь я хочу узнать запрос, чтобы получить все имена атрибутов, или запрос, чтобы получить все имена и значения атрибутов.

Ответы [ 2 ]

28 голосов
/ 17 марта 2010

Чтобы выбрать все атрибуты всех элементов в документе с именем Element1: //Element1/@*. Это вернет набор узлов , содержащий атрибут узлов. Затем вы можете выполнить итерацию набора узлов.

Если у вас уже есть контекстный узел и вы хотите найти результаты под ним, запрос будет .//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"); 

Чтобы получить атрибуты определенного элемента, выполните итерацию его свойства attribute .

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();
}
2 голосов
/ 06 июня 2015

Я должен был сделать это в Oracle Service Bus и использовать только 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(), ':', .), '_')
)
...