2011-02-07 54 views
1

我有一個XML文件,我試圖用Java進行搜索。我只需要通過它的標籤名稱找到一個元素,然後找到該標籤的值。因此,例如:XML搜索和解析

我有這個XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="https://company.com/test/xslt/processing_report.xslt"?> 
<Certificate xmlns="urn:us:net:exchangenetwork:Company"> 
    <Value1>Veggie</Value1> 
    <Value2>Fruits</Value2> 
    <type1>Apple</type1> 
     <FindME>Red</FindME> 
    <Value3>Bread</Value3> 
</Certificate> 

我想找到FindME標籤內的值。我無法使用XPath,因爲不同的文件可能具有不同的結構,但它們始終有一個FindME標記。最後,我正在尋找最簡單的代碼,我並不在乎性能。謝謝

回答

2

下面是代碼:

XPathFactory f = XPathFactory.newInstance(); 
    XPathExpression expr = f.newXPath().compile(
      "//*[local-name() = 'FindME']/text()"); 
    DocumentBuilderFactory domFactory = DocumentBuilderFactory 
      .newInstance(); 
    domFactory.setNamespaceAware(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document doc = builder.parse("src/test.xml"); //your XML file 

    Object result = expr.evaluate(doc, XPathConstants.NODESET); 
    NodeList nodes = (NodeList) result; 
    System.out.println(nodes.getLength()); 
    for (int i = 0; i < nodes.getLength(); i++) { 
     System.out.println(nodes.item(i).getNodeValue()); 
    } 

解釋:

//* - 比賽任何元素節點 - 無論他們在哪裏

local-name() ='FindME' - 當地名稱 - 即;不是完整路徑 - 匹配'FindME'

text() - 獲取節點值。

1

我認爲你需要閱讀XPath,因爲它可以很容易地解決這個問題。所以可以在DOM API中使用getElementsByTagName。

+0

我試過了DOMParser的getElementByTagName,但是它返回空值。 – 2011-02-07 18:09:10

1

您仍然可以使用XPath。您只需使用// FindMeread here on // usage)表達式。這將從xml中的任何位置查找「FindMe」元素,而不考慮它的父代或來自根的路徑。

如果您使用的命名空間,那麼要確保你正在解析器意識到

+0

你能告訴我一個例子嗎?我嘗試了各種解析器。 – 2011-02-07 18:07:38

+0

oooh ..我認爲命名空間可能是問題。我如何讓解析器意識到這一點? – 2011-02-07 18:12:35

1
String findMeVal = null; 

InputStream is = //... 
XmlPullParser parser = //... 
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); 
parser.setInput(is, null); 

int event; 
while (XmlPullParser.END_DOCUMENT != (event = parser.next())) { 
    if (event == XmlPullParser.START_TAG) { 
     if ("FindME".equals(parser.getName())) { 
      findMeVal = parser.nextText(); 
      break; 
     } 
    } 
}