2011-01-21 5 views
4

Я начинаю разбирать XML-документ и задавать вопрос: как получить значение параметра XML-элемента на Java?Как получить значение параметра XML-элемента?

XML документ:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<data> 
<keyword name="text123"> 
    <profile num="1"> 
     <url>http://www.a.com</url> 
     <field-1 param="">text</field-1> 
     <filed-2 param="">text</field-2> 
    </profile> 
    <profile num="2"> 
     <url>http://www.b.com</url> 
     <field-1 param="">text</field-1> 
     <filed-2 param="">text</field-2> 
    </profile> 
</keyword> 
<keyword name="textabc123"> 
    <profile num="1"> 
     <url>http://www.1a.com</url> 
     <field-1 param="">text</field-1> 
     <filed-2 param="">text</field-2> 
    </profile> 
    <profile num="2"> 
     <url>http://www.1b.com</url> 
     <field-1 param="">text</field-1> 
     <filed-2 param="">text</field-2> 
    </profile> 
</keyword> 
</data> 

код я пишу на Java:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
File xml_file=new File("file.xml"); 
if (xml_file.isFile() && xml_file.canRead()) { 
Document doc = builder.parse(xml_file); 
Element root = doc.getDocumentElement(); 
NodeList nodel = root.getChildNodes(); 
for (int a = 0; a < nodel.getLength(); a++) { 
    String data = /* code i don't know to write*/ 
    System.out.println(data); 
} 
} else {} 

я хочу, чтобы утешать элемент "ключевое слово" параметр "Имя" значение:

text123

и

text123abc

Пожалуйста, помогите, спасибо.

ответ

4
Node node = nodel.item(a); 
if(node instanceof Element) { 
    data = ((Element)node).getAttribute("name"); 
    System.out.println(data); 
} 
+0

после добавления кода i get error: Ошибка: com.sun.org.apache.xerces.internal.dom.DeferredTextImpl не может быть передан в org.w3c.dom.Element Что делать? – user488963

+0

с моим фрагментом невозможно получить это исключение, так как есть чек с экземпляром – lweller

+0

@Iweller Спасибо за ответ, я искал что-то вроде этого с некоторого времени +1 – Luffy

0

Список узлов содержит узлы, которые на самом деле являются экземплярами подинтерфейсов (Элемент, Текст и т. Д.).

Этот код должен работать таким образом:

Node node = nodel.item(a); 
if (node instanceof Element) { 
    Element e = (Element) node; 
    System.out.println(e.getAttribute("name"); 
} 
5

Вы можете использовать XPath

InputStream is = getClass().getResourceAsStream("somefile.xml"); 
DocumentBuilderFactory xmlFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuilder = xmlFactory.newDocumentBuilder(); 
Document xmlDoc = docBuilder.parse(is); 
XPathFactory xpathFact = XPathFactory.newInstance(); 
XPath xpath = xpathFact.newXPath(); 

String text123 = (String) xpath.evaluate("/data/keyword[1]/@name", xmlDoc, XPathConstants.STRING); 
String textabc123 = (String) xpath.evaluate("/data/keyword[2]/@name", xmlDoc, XPathConstants.STRING); 
+0

+1 по-моему, это правильно ответьте на вопрос. –

5

Я буду вести вас, как сделать это с помощью JAXB.

Прежде всего, ваш XML не очень хорошо сформирован. У вас есть filed вместо field на несколько мест.

Proper XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<data> 
<keyword name="text123"> 
    <profile num="1"> 
     <url>http://www.a.com</url> 
     <field-1 param="">text</field-1> 
     <field-2 param="">text</field-2> 
    </profile> 
    <profile num="2"> 
     <url>http://www.b.com</url> 
     <field-1 param="">text</field-1> 
     <field-2 param="">text</field-2> 
    </profile> 
</keyword> 
<keyword name="textabc123"> 
    <profile num="1"> 
     <url>http://www.1a.com</url> 
     <field-1 param="">text</field-1> 
     <field-2 param="">text</field-2> 
    </profile> 
    <profile num="2"> 
     <url>http://www.1b.com</url> 
     <field-1 param="">text</field-1> 
     <field-2 param="">text</field-2> 
    </profile> 
</keyword> 
</data> 

Далее перейдите в this website и скачать Trang.

Предполагая, что ваш файл XML имеет имя sample.xml, запустите его через Trang, используя java -jar trang.jar sample.xml sample.xsd, чтобы получить схему xsd для вашего XML-файла.

Теперь запустите xjc sample.xsd (xjc - это инструмент для генерации классов Java для схемы XML, в комплекте с Java 6 SDK).

Вы получите список классов Java:

 
generated\Data.java 
generated\Field1.java 
generated\Field2.java 
generated\Keyword.java 
generated\ObjectFactory.java 
generated\Profile.java 

Поместите их в файл проекта Java, и положить sample.xml где ваша программа может найти его. Теперь, это то, как вы получите имена ключевых слов:

JAXBContext context = JAXBContext.newInstance(Data.class); 
Data data = (Data)context.createUnmarshaller().unmarshal(new File("sample.xml")); 

List<Keyword> keywords = data.getKeyword(); 

for (Keyword keyword : keywords) { 
    System.out.println(keyword.getName()); 
} 

Этот метод может показаться немного грязный в начале, но если ваша структура XML не меняется, я считаю, что лучше иметь дело с типизированными объектами Java, чем с DOM сам.

+0

+1, но при создании объектной модели, когда вы можете просто создать свой собственный и добавить необходимые аннотации JAXB, чтобы получить нужное сопоставление. –

+1

@Blaise: true, но, делая это таким образом, можно сгенерировать схему, классы JAXB и код манипуляции менее чем за 5 минут ;-) – darioo

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