Найти тег по атрибуту и прочитать все его дети
У меня есть этот XML-файл:
<?xml version="1.0" encoding="UTF-8"?>
<Products>
<Product productName="testProduct1">
<Fields>
<Field name="Stack" />
<Field name="Overflow" />
</Fields>
<AnotherFields>
<Field name="Test" />
</AnotherFields>
</Product>
<Product productName="testProduct">
<Fields>
<Field name="Stackru" />
</Fields>
</Product>
</Products>
И хочу прочитать все дочерние теги product
который имеет исключительное значение атрибута productName
, все остальные теги это хочу пропустить.
И вот мой код Java, я застрял:
public void mainParser(XmlResourceParser configXML, String productNameParameter)
throws XmlPullParserException, IOException {
int eventType = -1;
String strName, productName;
while (eventType != XmlResourceParser.END_DOCUMENT) {
if (eventType == XmlResourceParser.START_TAG) {
strName = configXML.getName();
if (strName.equals("Product")) {
if (eventType == XmlResourceParser.START_TAG) {
productName = configXML.getAttributeValue(null, "productName");
if (productName.equals(productNameParameter)) {
eventType = configXML.next();
//here is the problem
}
}
}
}
eventType = configXML.next();
}
}
Кто-нибудь может помочь?
1 ответ
Решение
Я предлагаю проверять только типы событий на одном уровне, а не вложенные циклы, и использовать логические флаги, чтобы указать, что вы находитесь внутри определенного элемента "Product":
boolean foundIt = false;
while (eventType != XmlResourceParser.END_DOCUMENT) {
strName = configXML.getName();
if (eventType == XmlResourceParser.START_TAG) {
if (!foundIt && strName.equals("Product")) {
productName = configXML.getAttributeValue(null, "productName");
if (productName.equals(productNameParameter)) {
foundIt = true;
}
}
else if (foundIt) {
// Children
}
}
else if (eventType == XmlResourceParser.END_TAG) {
if (foundIt && strName.equals("Product")) {
foundIt = false;
return; // You've found what you want, leave method
}
}
eventType = configXML.next();
}
Теперь ты не будешь звонить configXML.next()
или проверка eventType
в нескольких местах, что может легко запутать. Обратите внимание, что однажды foundIt
это правда, мы перестаем искать теги "Product" и начинаем читать каждый новый элемент по умолчанию. Наконец, когда вы прочитаете конечный тег "Product", остановите все.