#java #xml #search #xmlstreamreader
#java #xml #Поиск #xmlstreamreader
Вопрос:
Мне нужно выполнить поиск элемента в файле .xml. Он имеет такую структуру:
<elements number="3">
<contact>
<name>PAUL</name>
<code>A1</code>
</contact>
<contact>
<name>LAURA</name>
<code>A2</code>
</contact>
<contact>
<name>JOHN</name>
<code>A3</code>
</contact>
Мое решение было бы таким:
public static String readContactsList(String nameContact) {
XMLInputFactory xmlif = null;
XMLStreamReader xmlr = null;
String contacts = "contacts.xml";
try {
xmlif = XMLInputFactory.newInstance();
xmlr = xmlif.createXMLStreamReader(contacts, new FileInputStream(contacts));
while (xmlr.hasNext()) {
switch (xmlr.getEventType()) {
case XMLStreamConstants.START_DOCUMENT:
System.out.println("Start Read Doc " contacts);
break;
case XMLStreamConstants.START_ELEMENT:
System.out.println("Tag " xmlr.getLocalName());
for (int i = 0; i < xmlr.getAttributeCount(); i )
System.out.printf(" => attribut %s->%s%n", xmlr1.getAttributeLocalName(i), xmlr.getAttributeValue(i));
break;
case XMLStreamConstants.END_ELEMENT:
System.out.println("END-Tag " xmlr.getLocalName());
break;
case XMLStreamConstants.COMMENT:
System.out.println("// comment " xmlr.getText());
break;
case XMLStreamConstants.CHARACTERS:
if (xmlr.getText().trim().length() > 0)
if (!xmlr.getText().equals(nameContact)) {
xmlr.next();
}
else
System.out.println("-> " xmlr.getText());
break;
}
xmlr.next();
}
}
catch (Exception e) {
System.out.println("reader initialization error");
System.out.println(e.getMessage());
}
return contacts;
}
Этот метод получает имя одного контакта (например, «LAURA») и должен вернуть его код. Чего мне не хватает, так это того, как прокручивать XML-файл и как получить доступ к содержимому различных тегов.
Спасибо!
Ответ №1:
Следующий код (основанный на вашем) должен работать, но имейте в виду, что если вы измените порядок тегов <name>
, и <code>
это приведет к сбою.
Кроме того, имейте в виду, что вы не закрываете поток. Просто поместите a finally {xmlr.close();}
, который закрывает поток.
public static String readContactsList(String nameContact) {
boolean match = false;
XMLInputFactory xmlif = null;
XMLStreamReader xmlr = null;
String contacts = "contacts.xml";
try {
xmlif = XMLInputFactory.newInstance();
xmlr = xmlif.createXMLStreamReader(contacts, new FileInputStream(contacts));
while (xmlr.hasNext()) {
switch (xmlr.getEventType()) {
case XMLStreamConstants.START_DOCUMENT:
System.out.println("Start Read Doc " contacts);
break;
case XMLStreamConstants.START_ELEMENT:
System.out.println("Tag " xmlr.getLocalName());
for (int i = 0; i < xmlr.getAttributeCount(); i )
System.out.printf(" => attribut %s->%s%n", xmlr.getAttributeLocalName(i), xmlr.getAttributeValue(i));
break;
case XMLStreamConstants.END_ELEMENT:
System.out.println("END-Tag " xmlr.getLocalName());
break;
case XMLStreamConstants.COMMENT:
System.out.println("// comment " xmlr.getText());
break;
case XMLStreamConstants.CHARACTERS:
if (xmlr.getText().trim().length() > 0) {
if (!xmlr.getText().equals(nameContact)) {
System.out.println("-> " xmlr.getText());
if (match) {
return xmlr.getText();
}
}
else {
System.out.println("-> " xmlr.getText());
//This is just in case the name and the code be the same
if (match) {
return xmlr.getText();
}
match = true;
}
}
break;
}
xmlr.next();
}
}
catch (Exception e) {
System.out.println("reader initialization error");
System.out.println(e.getMessage());
}
return contacts;
}