Я пытаюсь получить некоторую информацию из XML файла, но возвращает мне нулевой объект. Я использую DOM для анализа файла (см. Ниже код). Мне нужна помощь, потому что я не знаю, плохо ли это моя логика или мой код. Спасибо за ваше время !
public class ReadXMLFile {
private File fXmlFile;
private Document doc;
private Contact m_contact=null;
public ReadXMLFile(String name){
try{
m_contact = new Contact();
fXmlFile = new File("/pathtofile/"+name+".xml"); //should be verified
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
doc = dBuilder.parse(fXmlFile);
}
catch(Exception e){
e.printStackTrace();
}
}
public boolean readXml(String _id){
try{
doc.getDocumentElement().normalize();
if(doc.getDocumentElement().getNodeName().equalsIgnoreCase("listContact")){
NodeList nList = doc.getElementsByTagName("contact");
Node nNode;
nNode = nList.item(Integer.parseInt(_id));
if (nNode.getNodeName().equalsIgnoreCase("contact")){
if(nNode.getNodeType() == Node.ELEMENT_NODE){
System.out.println("\nCurrent Element :" + nNode.getNodeName());
Element eElement = (Element)nNode;//get element of node
m_contact.setId(Integer.parseInt(eElement.getAttribute("id")));
m_contact.setPhoneNumber(eElement.getAttribute("phoneNumber"));
m_contact.setName(eElement.getAttribute("name"));
m_contact.setFistName(eElement.getAttribute("firstName"));
return true;
}
}
}
return false;
}
catch(Exception e){
e.printStackTrace();
return false;
}
}
public Contact getM_contact() {
if(m_contact!=null){
return m_contact;
}
else
return null;
}
Это мой xml результат:
<listContact>
<contact id="0">
<firstName>martin</firstName>
<lastName>dupond</lastName>
<phoneNumber>514</phoneNumber>
<synchronize>false</synchronize>
</contact>
</listContact>
вывод:
Contact{id=0, phoneNumber=, name=, fistName=, synchronize=false}
Попробуйте это, я попробовал, и это сработало для меня
Node nNode = nList.item(Integer.parseInt(temp));
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("First Name : " + eElement.getElementsByTagName("firstName").item(0).getTextContent());
System.out.println("Last Name : " + eElement.getElementsByTagName("lastName").item(0).getTextContent());
System.out.println("Nick Name : " + eElement.getElementsByTagName("phoneNumber").item(0).getTextContent());
}
return false;
....
Вы используете getAttribute
в элементе contact
для извлечения значений для firstName
т.д., Но в вашем XML это не атрибуты, а дочерние элементы.
Если вы используете JDOM API, вы можете просто использовать метод getChild(name)
. В "стандартном" DOM API вам нужно пройти еще несколько обручей, но вот что-то вроде этого:
Element eElement = (Element)nNode;
// only one first name element
Element firstNameElem = eElement.getElementsByTagName("firstName").item(0);
m_contact.setFistName(firstNameElem.getNodeValue());
getElementsByTagName(name)
и обработать полученный NodeList
. Я обновлю свой ответ.