2013-11-12 5 views
2

У меня есть XML-документ, который анализируется на Java как документ w3c. В моем xml у меня есть много элементов с тем же именем, например <item ..... />, каждый из которых имеет уникальное значение атрибута, например <item name="a" .... />. я хочу в Java, чтобы сделать:Атрибут Xml id для работы с getElementById в Java?

doc.getElementById("a") 

для того, чтобы получить этот конкретный пункт у меня есть с этим именем. Как я могу сказать, что java использует «имя» в качестве идентификатора? Или, поочередно, как я могу получить этот конкретный элемент в наименьшей сложности?

ответ

3

DOM - не лучший API, который легко запрашивает ваш документ и возвращает найденные элементы. Изучите XPath, который является более подходящим API, или самостоятельно перебирайте дерево элементов.

getElementById() возвращает только элемент, который имеет заданный атрибут id (изменить: помечено как таковое в документе DTD или схеме). Он не может найти атрибут name.

Для получения более подробной информации см. Java XML DOM: how are id Attributes special?.

+0

Я пробовал следующий XML: ' ......' и я все еще получаю null. Почему это? – buddy123

+0

Теперь я смущен. Я искренне думал, что идентификатор де-факто является элементом ID, но javadoc указывает, что атрибут рассматривается только как атрибут идентификатора, если он объявлен как таковой (я полагаю, в DTD или схеме). См. Http: // webdesign.Например, about.com/od/xml/a/aa061801a.htm. См. Также http://stackoverflow.com/questions/3423430/java-xml-dom-how-are-id-attributes-special –

+0

Спасибо. с чего мне начать. Однако, кажется, это раздражает, так как однажды я объявляю схему dtd. Это означает, что любой атрибут, который я не объявлял в схеме, недействителен и не должен быть там – buddy123

0

Чтобы doc.getElementById("a") работу, которую нужно изменить XML в <item id="a" name="a" .... />

Если вы не можете изменить XML, вы можете использовать XPath для извлечения этого элемента.

+0

То, что я уже пробовал, но она возвращает нулевое – buddy123

+0

Вы добавили идентификатор атрибут тега элемента и метод getElementById возвращает значение null? –

+0

Да, я действительно не знаю, почему. См. Ответ на JB Nizet, я разместил там xml. – buddy123

1

Вам необходимо написать DTD, который определяет ваш атрибут как тип ID.

1

Ну, чтобы получить полный ответ, мне пришлось использовать схемы DTD, как и все, о которых говорилось. Поскольку мои потребности достаточно просты, я добавил его в встроенный в моем XML следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root [ 
    <!ATTLIST item 
     name ID #REQUIRED 
     > 
]> 
<root> .... </root> 

Единственная важная вещь, оставленная знать, что как только вы объявляете ATTLIST, я должен объявить все остальные из моих атрибутов, поэтому вам нужно добавить ПОДРАЗУМЕВАЕМЫМ:

some-attribute CDATA #IMPLIED 

он говорит, что некоторые-атрибут содержит некоторые данные (можно использовать также PCDATA для анализируемой CDATA), и подразумевается, что означает, что может быть там или это не может. не имеет значения.

Так в конце концов, это будет выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root [ 
    <!ATTLIST item 
     name ID #REQUIRED 
     some-attribute CDATA #IMPLIED 
     > 
]> 
<root> .... </root> 

И с Java стороны, просто использовать его вслепую, например getElementById("some-name")

+0

Это, похоже, не работает само по себе. Я думаю, нам также нужно определить имена элементов. – HRJ

+0

@HRJ для меня это работало безупречно. вы использовали схему dtd, встроенную в xml, или вы поместили ее в другой файл? Если первое, оно должно работать так, как я писал, и если последнее, возможно, вам нужно «импортировать» его. если оба xml и dtd находятся в одной папке, попробуйте ' 'в верхней части xml-файла – buddy123

+0

Я встроил его. Ошибка, которую я получил, была (перефразировать): 'html, body, p, elements not defined'. Можете ли вы указать точное DTD, которое нужно добавить для документа HTML/XHTML/XML? – HRJ

Смежные вопросы