2011-02-07 16 views
1

Javaを使用して検索しようとしているXMLファイルがあります。タグ名で要素を見つけて、そのタグの値を見つけるだけでいいです。だから、例えば: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

の意識パーサを作っていることを確認した名前空間を使用している場合は、コードで

//* - 試合任意の要素ノード - どこにあっても

local-name() = 'FindME' - ローカル名 - つまり、完全パスではない - FindMEと一致する

text() - ノード値を取得する。

+0

** IT WORKED !! **ありがとうございます! –

1

XPathでこの問題を非常に簡単に解決できるので、あなたは読んでおく必要があると思います。したがって、DOM APIでgetElementsByTagNameを使用することができます。

+0

私はDOMParserのgetElementByTagNameを試しましたが、Nullを返します。 –

1

XPathを引き続き使用できます。あなたがする必要があるのは、// FindMeread here on // usage)の式を使用することだけです。これは、ルートから親またはパスに関係なくxml内のどこからでも "FindMe"要素を見つけます。

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()); 
    } 

はの説明:

あなたは、あなたはここでその

+0

私に例を教えてもらえますか?私はあらゆる種類のパーサを試しました。 –

+0

うーん。私は名前空間が問題かもしれないと思います。パーサーはそれをどのように認識させるのですか? –

+1

'// * [local-name()= 'FindMe']'は名前空間を考慮しません –

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; 
     } 
    } 
}