2013-08-05 24 views
2

我只想解析与标记相关的值Margherita。有可能解析标签相关的值?如何只解析特定的标签值?

<?xml version="1.0" encoding="UTF-8"?> 
<menu> 
<item> 
    <id>1</id> 
    <name>Margherita</name> 
    <cost>155</cost> 
    <description>Single cheese topping</description> 
</item> 
<item> 
    <id>6</id> 
    <name>Margherita</name> 
    <cost>155</cost> 
    <description>Single cheese topping</description> 
</item> 
<item> 
    <id>8</id> 
    <name>Margherita</name> 
    <cost>1535</cost> 
    <description>Single cheese topping</description> 
</item> 
<item> 
    <id>2</id> 
    <name>Double Cheese Margherita</name> 
    <cost>22e5</cost> 
    <description>Loaded with Extra Cheese</description> 
</item> 
<item> 
    <id>3</id> 
    <name>Fresh Veggie</name> 
    <cost>110</cost> 
    <description>Oninon and Crisp capsicum</description> 
</item> 
<item> 
    <id>4</id> 
    <name>Peppy Paneer</name> 
    <cost>155</cost> 
    <description>Paneer, Crisp capsicum and Red pepper</description> 
</item> 
<item> 
    <id>5</id> 
    <name>Mexican Green Wave</name> 
    <cost>445</cost> 
    <description>Onion, Crip capsicum, Tomato with mexican herb</description> 
</item> 
</menu> 

在上面的XML,我想只显示相关Margherita变量的值。这可能吗?如果是这样,怎么样?

+5

欢迎堆栈溢出!看起来你希望我们为你写一些代码。尽管许多用户愿意为遇险的编码人员编写代码,但他们通常只在海报已尝试自行解决问题时才提供帮助。证明这一努力的一个好方法是包含迄今为止编写的代码,示例输入(如果有的话),期望的输出和实际获得的输出(控制台输出,堆栈跟踪,编译器错误 - 无论是适用)。您提供的细节越多,您可能会收到的答案就越多。 – thegrinner

回答

2

这里是一个示例代码,它是一个简单的java项目,不是android,但它适用于我!

import java.io.File; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class test { 
public static void main(String argv[]) { 
    try { 

     File fXmlFile = new File("D:/Xml.xml"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(fXmlFile); 

     doc.getDocumentElement().normalize(); 

     System.out.println("Root element :" 
       + doc.getDocumentElement().getNodeName()); 

     NodeList nList = doc.getElementsByTagName("item"); 

     System.out.println("----------------------------"); 

     for (int temp = 0; temp < nList.getLength(); temp++) { 

      Node nNode = nList.item(temp); 

      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 

       Element eElement = (Element) nNode; 

       if (eElement.getElementsByTagName("name").item(0) 
         .getTextContent().equals("Margherita")) { 
        System.out.println("Id: " 
          + eElement.getElementsByTagName("id").item(0) 
            .getTextContent()); 
        System.out.println("It costs: " 
          + eElement.getElementsByTagName("cost").item(0) 
            .getTextContent()); 
        System.out.println(eElement 
          .getElementsByTagName("name").item(0) 
          .getTextContent()); 
        System.out.println("Description:" 
          + eElement.getElementsByTagName("description") 
            .item(0).getTextContent()); 
        System.out.println(); 
       } 

      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 
1

我建议使用Simple库,并建模一些数据类来绑定到xml。

项目类:

import org.simpleframework.xml.Element; 
import org.simpleframework.xml.Root; 

@Root(name="item") 
public class Item{ 

    @Element(name = "id", required = true) 
    public int id; 

    @Element(name = "name", required = true) 
    public String name; 

    @Element(name = "cost", required = true) 
    public double cost; 

    @Element(name = "description", required = true) 
    public String desc; 
} 

Menu类:

import org.simpleframework.xml.ElementList; 
import org.simpleframework.xml.Root; 

import java.util.List; 

@Root(name="menu") 
public class Menu{ 
    @ElementList(inline = true,type = Item.class) 
    public List<Item> items; 
} 

它反序列化对象:

Serializer srl = new Persister(); 

//--- Placed menu.xml in /assets for a test --- 
//--- you can obtain it from somewhere else like a web server etc also --- 
InputStream ips = getAssets().open("menu.xml"); 

Menu menu = srl.read(Menu.class,ips); 

if(menu != null && menu.items != null){ 

    for (Item i : menu.items){ 

     if(i.name != null && i.name.contains("Margherita")){ 
      //--do something with this item-- 
     } 

    } 

}