По рекомендации кого-то здесь, в Stackoverflow, я изменил свой метод разбора на SAXParser.
Благодаря различным учебникам я могу заставить его работать, и я должен сказать, что он работает быстрее (что очень важно для моего приложения).
Проблема, однако, в том, что мой XML файл идет глубже, чем пример XML, который я видел.
Это пример моего XML файла:
<Message>
<Service>servicename</Service>
<Insurances>
<BreakdownInsurance>
<Name>Insurance name</Name>
<InsuranceNR/>
<LicenseNr/>
</BreakdownInsurance>
<CarDamageInsurance>
<Name>Insurance name 2</Name>
<InsuranceNR></InsuranceNR>
</CarDamageInsurance>
</Insurances>
<Personal>
<Name>my name</Name>
</Personal>
</Message>
Я могу получить личные данные, такие как имя, но мой код, похоже, не работает с страхованием. Я думаю, это потому, что это еще один node.
Это код, который я использую в классе Handler:
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
currentElement = true;
if (localName.equals("Message")) {
geg = new GegevensXML();
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
currentElement = false;
/********** Autopech **********/
if (localName.equals("Name")) {
geg.setAutopechMaatschappij(currentValue);
}
else if (localName.equals("InsuranceNR")){
geg.setAutopechPolis(currentValue);
}
else if (localName.equals("LicenseNr")){
geg.setAutopechKenteken(currentValue);
}
@Override
public void characters(char ch[], int start, int length) {
if (currentElement) {
currentValue = new String(ch, start, length);
currentElement = false;
}
Итак, как мне настроить его?
@Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { currentElement = true; if (localName.equals("Message")) { geg = new GegevensXML(); } if(localName.equals("BreakdownInsurance")) { BreakdownInsurance = true; } } @Override public void endElement(String namespaceURI, String localName, String qName) throws SAXException { currentElement = false; /********** Autopech **********/ if (localName.equals("Name")) { if(BreakdownInsurance) { geg.setBreakdownInsuranceName(currentValue); BreakdownInsurance = false; } else { geg.setAutopechMaatschappij(currentValue); } } else if (localName.equals("InsuranceNR")){ geg.setAutopechPolis(currentValue); } else if (localName.equals("LicenseNr")){ geg.setAutopechKenteken(currentValue); }
Аналогично делать это для других случаев... 'BreakdownInsurance' является логическим. используйте его как флаг...
Глубина не должна быть проблемой. У меня больше уровней, и точный код работает отлично для меня. Может быть, у вас есть несколько узлов с тем же именем? "Имя" в Личном и "Имя" в этих узлах страхования?
Просто измените endElement()...
Добавьте флаги, чтобы указать, где текущее Имя должно быть сохранено, поскольку у вас есть Имя, которое подходит как под <BreakdownInsurance>
, так и <Personal>
.