2015-05-21 4 views
0

У меня есть этот код:Как найти тег в XML по значению?

protected void getFilmsByActorFromXml(String xmlFile, String actorName) { 
    try { 

     dbf.setValidating(false); 
     db = dbf.newDocumentBuilder(); 
     doc = db.parse(xmlFile); 
     doc.getDocumentElement().normalize(); 

     nList = doc.getElementsByTagName(actorName).item(0).getChildNodes(); 

, который может найти и дать мне все значения имени актера. Теперь в XML у меня есть новый тег (слово). Мне нужно напечатать все значения, где слово «A».

Это новый XML блок:

<actors> 
    <Brus_Wuillis> 
     <films> 
      <word>A</word> 
      <film_name>Armageddon</film_name> 
      <year>1998</year> 
      <genre>Action</genre> 
     </films> 
     <films> 
      <word>S</word> 
      <film_name>Sin City</film_name> 
      <year>2005</year> 
      <genre>Thriller</genre> 
     </films> 
     <films> 
      <word>A</word> 
      <film_name>A Good Day to Die Hard</film_name> 
      <year>2013</year> 
      <genre>Action</genre> 
     </films> 
    </Brus_Wuillis> 
</actors> 
+1

Вы хотите сказать, вы хотите, чтобы получить все узлы Film, где значение слова есть –

+0

Я думаю, что вы нужно добавить атрибут в теги, например drgPP

+2

Вы можете легко получить список узлов, используя xpath '/ players/Brus_Wuillis/films [word =" A "]' –

ответ

0

Вот пример, чтобы получить узлы с помощью XPath.

public class MovieReader 
{ 

    public static void main(String[] args) 
    { 
    String actorsName = "Brus_Wuillis"; 

    String xml = "<actors>\n" + 
      " <Brus_Wuillis>\n" + 
      "  <films>\n" + 
      "   <word>A</word>\n" + 
      "   <film_name>Armageddon</film_name>\n" + 
      "   <year>1998</year>\n" + 
      "   <genre>Action</genre>\n" + 
      "  </films>\n" + 
      "  <films>\n" + 
      "   <word>S</word>\n" + 
      "   <film_name>Sin City</film_name>\n" + 
      "   <year>2005</year>\n" + 
      "   <genre>Thriller</genre>\n" + 
      "  </films>\n" + 
      "  <films>\n" + 
      "   <word>A</word>\n" + 
      "   <film_name>A Good Day to Die Hard</film_name>\n" + 
      "   <year>2013</year>\n" + 
      "   <genre>Action</genre>\n" + 
      "  </films>\n" + 
      " </Brus_Wuillis>\n" + 
      "</actors>"; 


    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = null; 
    try 
    { 
     builder = factory.newDocumentBuilder(); 
    } 
    catch (ParserConfigurationException e) 
    { 
     e.printStackTrace(); 
    } 
    try 
    { 
     InputSource is = new InputSource(new StringReader(xml)) ; 
     Document doc = builder.parse(is); 
     XPathFactory xPathfactory = XPathFactory.newInstance(); 
     XPath xpath = xPathfactory.newXPath(); 
     XPathExpression expr = xpath.compile("/actors/"+ actorsName +"/films[word=\"A\"]"); 
     NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
     for (int i = 0; i < nl.getLength(); i++) 
     { 
     Node node = nl.item(i); 
     System.out.println(nl.item(i).getNodeName()); 
     Element element = (Element) node; 
     Node filmNode = element.getElementsByTagName("film_name").item(0);; 
     System.out.println(filmNode.getTextContent()); 
     } 
    } 
    catch (SAXException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (XPathExpressionException e) 
    { 
     e.printStackTrace(); 
    } 
    } 
} 
0

Я пересчитываю используя data projection для этого. (Раскрытие: Я связан с этим проектом)

public class FindTagByValue { 

    public interface Actors { 
     @XBRead("/actors/Brus_Wuillis/films[word=$PARAM0]") 
     List<Film> getFilmsWithWord(String word); 
    } 

    public interface Film { 
     @XBRead("./film_name") 
     String getName(); 

     @XBRead("./year") 
     int getYear(); 

     @XBRead("./genre") 
     String getGenre(); 
    } 

    public static void main(String[] args) throws IOException { 
     Actors actors = new XBProjector(Flags.TO_STRING_RENDERS_XML).io().url("res://actors.xml").read(Actors.class); 
     for (Film film : actors.getFilmsWithWord("A")) { 
     System.out.println(film.getName()+" ("+film.getYear()+")"); 
     } 
    } 
} 

Эта программа печатает:

Armageddon (1998) 
A Good Day to Die Hard (2013) 
Смежные вопросы