2010-03-17 13 views
5

Я использую xpath в java. Я хочу получить все атрибуты (имя & Значение) элемента. Я нашел запрос, чтобы получить значения атрибута элемента, теперь я хочу получить имена атрибутов самостоятельно или имена и значения в одном запросе.Xpath - Как получить все имена атрибутов и значения элемента

<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

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

ответ

22

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

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

больших ансов! я смотрел именно на это! Благодаря! (Btw ... есть опечатка, это String, а не строка) –

1

Я должен был сделать это в 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(), ':', .), '_') 
) 
Смежные вопросы