2011-04-19 158 views
2

我需要(使用Java),用於從XML文件中給定的名稱標籤這樣的標籤來提取:Java的XML解析

這裏是我的XML文件:

<aa> 
    <bb> 
    <name>k1</name> 
    <value>5</value> 
    </bb> 
    <bb> 
    <name>k2</name> 
    <value>7</value> 
</bb> 
</aa> 

輸入到功能:full path to <name> tag, e.g.: /aa/bb/name=k2
(這個例子的輸出應該返回7

還有更高級的問題:我需要從XML文件中提取所有名稱:值對,然後名稱由正則表達式給出 我在想,XPath在這裏是合適的工具,但是細節中的魔鬼。

+0

您有問題嗎? (由此我的意思是**特定的**問題。) – 2011-04-19 03:09:16

+0

我想你在這裏有三個問題。 1.獲得值7,即value_tag_start的值在第二個bb_tag_start內。 2.獲取所有名稱值對,即標籤名稱和值。 3.如果標籤名稱以正則表達式的形式給出,則獲取該值。請澄清 – Ammu 2011-04-19 03:25:11

+0

致:Andrew Thompson。我從你的列表中有問題1和3。謝謝! – user607573 2011-04-19 04:08:36

回答

2

您可以使用包含5的Java SE的一部分javax.xml.xpath中的API:

import java.io.FileReader; 

import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathExpression; 
import javax.xml.xpath.XPathFactory; 

import org.xml.sax.InputSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 
     XPathExpression xpe = xpath.compile("//bb[name/text()='k2']/value"); 

     InputSource xml = new InputSource(new FileReader("input.xml")); 
     String result = xpe.evaluate(xml); 
     System.out.println(result); 
    } 
} 
0

嘗試jcabi-xml(見本blog post)用一行代碼:

String found = new XMLDocument(text).xpath("/aa/bb[name='k2']/text()").get(0); 
0
import org.jdom.Document; 
import org.jdom.Element; 
import org.jdom.JDOMException; 
import org.jdom.input.SAXBuilder; 
import org.jdom.xpath.XPath; 
import org.junit.Test; 

import static org.junit.Assert.*; 

import java.io.File; 
import java.io.IOException; 

import javax.xml.xpath.XPathExpressionException; 

public class XmlParsingTest { 
    @Test 
    public void testParsing() throws XPathExpressionException, JDOMException, IOException { 

     SAXBuilder builder = new SAXBuilder(); 
     File xmlFile = new File("src/test/resources/yourXMLDoc.xml"); 

     Document origDoc = (Document) builder.build(xmlFile); 

     XPath xPathMonsOccCategoryIdInOriginalDoc = XPath.newInstance("//bb[name/text()='k2']/value"); 

     Element element = (Element) xPathMonsOccCategoryIdInOriginalDoc.selectSingleNode(origDoc.getRootElement()); 

     assertEquals("7", element.getTextTrim()); 


} 

}

0

下面是一個使用vtd-xml提取值的代碼。

import com.ximpleware.*; 

public class extractValue{ 
    public static void main(String s[]) throws VTDException, IOException{ 
     VTDGen vg = new VTDGen(); 
     if (!vg.parseFile("input.xml", false)); 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     ap.selectXPath("/aa/bb[name='k1']/value"); 
     int i=0; 
     while ((i=ap.evalXPath())!=-1){ 
      System.out.println(" value ===>"+vn.toString(i)); 
     } 
    } 
}