kxml2 парсинг простого XML
Я пытаюсь разобрать простой файл XML в моем приложении j2me. Но разбора не получается
XML-файл
<companies>
<company CompanyId="6">
<CompanyName>Test Company 1</CompanyName>
<SapNumber>0</SapNumber>
<RootCompanyId>1</RootCompanyId>
<ParentCompanyId /> </company>
</companies>
Синтаксический анализатор
KXmlParser parser = new KXmlParser();
parser.setInput(new InputStreamReader(new ByteArrayInputStream(input.getBytes())));
parser.nextTag();
parser.require(XmlPullParser.START_TAG, null, "companies");
while(parser.nextTag() == XmlPullParser.START_TAG)
{
Company temp_company = new Company();
parser.require(XmlPullParser.START_TAG, null, "company");
String CompanyID = parser.getAttributeValue(0);
temp_company.putValue("CompanyId", CompanyID);
while(parser.nextTag() == XmlPullParser.START_TAG)
{
if(parser.getName() == "CompanyName")
{
temp_company.putValue("CompanyName", parser.nextText());
}
}
parser.require(XmlPullParser.END_TAG, null, "company");
listCompany.put(CompanyID, temp_company);
}
parser.require(XmlPullParser.END_TAG, null, "elements");
1 ответ
Решение
Я думаю, я вижу, что здесь происходит не так. После того, как вы сопоставили <company>
тег и получив значение атрибута CompanyId, вы вводите цикл while. Но понаблюдайте, что произойдет в этот момент:
- При первом выполнении условия while парсер будет соответствовать
<CompanyName>
начальный тег, поэтому условие if будет истинным, и вы получите текст внутри тега. - Я не слишком близок с внутренней работой kXml, но на второй итерации ваше состояние синтаксического анализатора должно указывать либо на текстовый узел (то есть внутри
<CompanyName>
тег) или в конце тега (т.е.</CompanyName>
). В любом случае, вы не сможете выполнить условие, потому что вы не находитесь в начальном теге. - На этом этапе вам требуется, чтобы следующий тег был конечным тегом
<company>
Однако ваше состояние все еще не изменилось, и это не будет удовлетворено.
Я думаю, что внутренний указатель указывает на текстовый узел внутри <CompanyName>
и именно поэтому вы получаете "unexpected type (position: Text: Test Company1..."
сообщение.