【问题标题】:How to find tag in XML by value?如何按值在 XML 中查找标签?
【发布时间】:2015-05-21 08:00:14
【问题描述】:

我有这个代码:

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>

【问题讨论】:

  • 你的意思是要获取word值为A的所有Film节点
  • 我认为您需要为 标签添加一个属性,例如
  • 使用xpath /actors/Brus_Wuillis/films[word="A"]可以轻松获取节点列表
  • 实际上我有一个包含很多演员的大 XML,哪些演员有很多电影。所以我想得到所有单词值为A的电影。

标签: java xml tags


【解决方案1】:

这是一个使用 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();
    }
  }
}

【讨论】:

    【解决方案2】:

    我建议为此使用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)
    

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多