如何按值在XML中查找标记?

时间:2015-05-21 08:00:15

标签: java xml tags

我有这段代码:

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中我有一个新标签(word)。我需要打印所有值,例如' 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>

2 个答案:

答案 0 :(得分: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();
    }
  }
}

答案 1 :(得分: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)
相关问题