プレフィックスのない名前空間とプレフィックス ('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 / などの完全な初心者です)