Разбор XML-файла с использованием Jdom и SAX Parser

У меня есть XML в формате:

<response>

<result name="response" numFound="295" start="0">
<doc>
<str name="Content">...</str>
<str name="Latitude">36.48617</str>
<str name="Longitude">-89.97065</str>
<str name="id">00000001 pages 1-249.pdf</str>
</doc>
<doc>
<str name="Content">...</str>
<str name="Latitude">33.59927</str>
<str name="Longitude">-86.69304</str>
<str name="id">100-449923 section 26 -114.pdf</str>
</doc>
<doc>

Мне нужно найти значения Content, Latitude и Longitude в переменной. Пока мой код:

SAXBuilder sax=new SAXBuilder();
Document doc= (Document) sax.build(new StringReader(xmlstr));
Element rootElem=doc.getRootElement();
out.println("rootElem = " + rootElem.toString());
Element res=rootElem.getChild("result");
List docs=res.getChildren("doc");

for(int i=0;i<docs.size();i++)
{
    out.println("docsSize = " + docs.size());
    Element row= (Element)docs.get(i);
    //List strs= docs(i).getChildren("str");
    List strs=row.getChildren("str");
    for(int j=0;j<strs.size();j++){
        out.println("strs = " + strs.size());
        //out.println(strs.get(j).getValue());
        List column =  (List)strs.get(j);
        if(column.getAttribute("name").getValue()=='Content')
            {
            out.println("Hi");
            out.println(column.getAttribute("name").getValue());
            out.println("Bi");
            }
        //String Content = column.getAttribute("name").get(1).getValue();
        //String value = column.getText();
        //out.println("Content = " + Content);
        //out.println("value = " + value);
    }
    //out.println(content);
    break;
}
}catch(Exception e)
{
    out.println(e);
}   

Но все же я не могу получить значения широты и долготы, хотя я получаю размер массива, в котором они находятся. Можете ли вы предложить то же самое?


person Rachit Kumar    schedule 30.04.2012    source источник
comment
Какой результат вы получите при выполнении?   -  person Sachin Mhetre    schedule 30.04.2012


Ответы (4)


это if(column.getAttribute("name").getValue()=='Content') будет разрешать только Content. поэтому широта и долгота не будут входить в ваше условие if, где вы печатаете значения.

попробуйте этот if(column.getAttribute("name").getValue()!='id'), он напечатает Content, Latitude и Longitude.

person Sathish Santhosam    schedule 30.04.2012
comment
это не помогло. Мне требовалось значение содержимого этого тега, т.е. 33.59927. Спасибо за ответ. - person Rachit Kumar; 30.04.2012

Написание такого низкоуровневого навигационного кода на Java ужасно многословно и чревато ошибками. Почему бы не использовать XPath в сочетании с кодом Java или, что еще лучше, не написать все это на XQuery или XSLT?

person Michael Kay    schedule 30.04.2012

Если вы хотите получить атрибуты по имени:

for(int j=0;j<strs.size();j++){
    out.println("strs = " + strs.size());
    Element column =  (Element) strs.get(j);
    out.println("Content: " + column.getAttributeValue("Content"));
    out.println("Latitude: " + column.getAttributeValue("Latitude"));
    out.println("Longitude: " + column.getAttributeValue("Longitude"));
    out.println("id: " + column.getAttributeValue("id"));
}

Если вы хотите перебирать атрибуты:

for(int j=0;j<strs.size();j++){
    out.println("strs = " + strs.size());
    Element column =  (Element) strs.get(j);
    for (Attribute a : column.getAttributes())
      out.println("Name: " + a.getName() + " Value: " + a.getValue());
}
person erikxiv    schedule 30.04.2012

У вас есть несколько проблем.

Я думаю, что ваш код будет делать то, что вы ожидаете, если вы исправите свои сравнения строк...

if(column.getAttribute("name").getValue()=='Content')

никогда не будет работать. Использование оператора == для строкового значения очень редко бывает «правильным».

Пытаться:

if("Content".equals(column.getAttribute("name").getValue()))

О, я вижу, что все ваши одинарные кавычки означают, что вы не дали нам свой настоящий код Java.... Одинарные кавычки вокруг "Содержимого" даже не скомпилируются....

person rolfl    schedule 30.04.2012