0

プレフィックスのない名前空間とプレフィックス ('video') 付きの標準の名前空間の両方を持つ xml ファイルの解析について問題があります*:「ビデオ」プレフィックスを持つすべてのタグで常に null を取得します...私はすでに同じファイルに複数のプレフィックスを付けても同じで、問題ありませんでした。私はまさにそれで問題が発生します...そして、「プレフィックスなし」の名前空間を持つのも初めてなので、問題がこのプレフィックスのない名前空間に起因するのか、それとも非常にビデオに起因するのかはわかりません。

ここにいくつかのサンプルがあります:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
  <url>
    <loc>http://www.dailymotion.com/video/xtx3pa_decouvrez-l-onyx-voiture-des-reves-de-peugeot_news</loc>
    <video:video>
      <video:player_loc allow_embed="yes">http://www.dailymotion.com/swf/video/xtx3pa?autoPlay=1</video:player_loc>
      <video:title>Découvrez l'Onyx, voiture des rêves de Peugeot</video:title>
      <video:description>Révélée au Mondial de l'Automobile ce matin, la dernière concept-car du constructeur a fait sensation.</video:description>
      <video:publication_date>1348768884</video:publication_date>
      <video:tag>mondial</video:tag>

      <video:category>news</video:category>
      <video:language>FR</video:language>
    </video:video>
  </url>
  <url>  ...</url>...

そして、これが私が使用するコードです。次のコードと、ここで見つけた例です。

  static public class MyNamespaceContext implements NamespaceContext {
     final private Map<String, String> prefixMap;
     MyNamespaceContext(Map<String, String> prefixMap)
     {
         if (prefixMap != null)
         {
             this.prefixMap = Collections.unmodifiableMap(new HashMap<String, String>(prefixMap));
         }
         else
         {
             this.prefixMap = Collections.emptyMap();
         }
     }
     public String getPrefix(String namespaceURI) {
         // TODO Auto-generated method stub
         return null;
     }
     public Iterator getPrefixes(String namespaceURI) {
         // TODO Auto-generated method stub
         return null;
     }
     public String getNamespaceURI(String prefix) {
             if (prefix == null) throw new NullPointerException("Invalid Namespace Prefix");
             else if (prefix.equals(XMLConstants.DEFAULT_NS_PREFIX))
                 return "http://www.sitemaps.org/schemas/sitemap/0.9";
             else if ("video".equals(prefix))
                 return "http://www.google.com/schemas/sitemap-video/1.1";
             else    
                 return "http://www.sitemaps.org/schemas/sitemap/0.9";
     }


 }

XPathFactory fabrique = XPathFactory.newInstance();
xpath = fabrique.newXPath();
xpath.setNamespaceContext(new MyNamespaceContext(null));
final String videosPath = "//urlset/url";
try{
    XPathExpression exp = xpath.compile(videosPath);
    videoLists = (NodeList)exp.evaluate(inDoc,XPathConstants.NODESET);
}catch(XPathExpressionException e){
    logger.info("oops",e);
    }
for(int i=0; i<videoLists.getLength(); i++){
    Node node = videoLists.item(i);
    XPathExpression exp = xpath.compile("video:video/video:title");
        String title = exp.evaluate((Element)node);
        XPathExpression exp2 = xpath.compile("loc");
        String loc = exp2.evaluate((Element)node);

        logger.info("title  : " +title); // => null
        logger.info("loc : " + loc); => http://www.dailymotion.com/swf/video/xtx3pa?autoPlay=1
}

(*) (言うまでもなく、私は DOM / xpath / などの完全な初心者です)

4

1 に答える 1

0

You haven't shown your XPath expression. In XPath 1.0, no prefix always means no namespace. If you want to access nodes in a namespace (even the default namesspace), you have to use prefixed names in the XPath expression. You can't use a NamespaceContext to map the "null prefix" to a namespace, because the XPath spec doesn't allow it.

Why not move to XPath 2.0 which is more flexible? It's well supported in Java, for example by the Saxon library. XPath 1.0 has been obsolete for years.

于 2013-08-08T11:41:07.083 に答える