Son bir gün, aşağıdaki belgeden bir XML düğümü ayıklamak için çalıştım ve çalışmasını sağlamak için XML Ad alanı nüanslarını yakalayamıyorum. XPath, XML Ad Alanları ve Java
XML dosyası
işte toplamda yayınlamak için büyük olmaktır beni ilgilendiren kısmı ise:<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<XFDL xmlns="http://www.PureEdge.com/XFDL/6.5" xmlns:custom="http://www.PureEdge.com/XFDL/Custom" xmlns:designer="http://www.PureEdge.com/Designer/6.1" xmlns:pecs="http://www.PureEdge.com/PECustomerService" xmlns:xfdl="http://www.PureEdge.com/XFDL/6.5">
<globalpage sid="global">
<global sid="global">
<xmlmodel xmlns:xforms="http://www.w3.org/2003/xforms">
<instances>
<xforms:instance id="metadata">
<form_metadata>
<metadataver version="1.0"/>
<metadataverdate>
<date day="05" month="Jul" year="2005"/>
</metadataverdate>
<title>
<documentnbr number="2062" prefix.army="DA" scope="army" suffix=""/>
<longtitle>HAND RECEIPT/ANNEX NUMBER </longtitle>
</title>
belge devam eder ve iyi aşağı kadar oluşturulur. "Documentnbr" etiketinden "sayı" özniteliğini çıkarmaya çalışıyorum (alttan üç tane).
bunu yapmak kullanıyorum kod şuna benzer:
/***
* Locates the Document Number information in the file and returns the form number.
* @return File's self-declared number.
* @throws InvalidFormException Thrown when XPath cannot find the "documentnbr" element in the file.
*/
public String getFormNumber() throws InvalidFormException
{
try{
XPath xPath = XPathFactory.newInstance().newXPath();
xPath.setNamespaceContext(new XFDLNamespaceContext());
Node result = (Node)xPath.evaluate(QUERY_FORM_NUMBER, doc, XPathConstants.NODE);
if(result != null) {
return result.getNodeValue();
} else {
throw new InvalidFormException("Unable to identify form.");
}
} catch (XPathExpressionException err) {
throw new InvalidFormException("Unable to find form number in file.");
}
}
QUERY_FORM_NUMBER benim XPath ifadesidir ve XFDLNamespaceContext NamespaceContext uygular ve şöyle görünür Nerede:
public class XFDLNamespaceContext implements NamespaceContext {
@Override
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.PureEdge.com/XFDL/6.5";
else if ("custom".equals(prefix))
return "http://www.PureEdge.com/XFDL/Custom";
else if ("designer".equals(prefix))
return "http://www.PureEdge.com/Designer/6.1";
else if ("pecs".equals(prefix))
return "http://www.PureEdge.com/PECustomerService";
else if ("xfdl".equals(prefix))
return "http://www.PureEdge.com/XFDL/6.5";
else if ("xforms".equals(prefix))
return "http://www.w3.org/2003/xforms";
else
return XMLConstants.NULL_NS_URI;
}
@Override
public String getPrefix(String arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public Iterator getPrefixes(String arg0) {
// TODO Auto-generated method stub
return null;
}
}
Ben ettik birçok farklı XPath sorguları denedim ama çalışması gerekir böyle hissetmekten tutmak:
protected static final String QUERY_FORM_NUMBER =
"/globalpage/global/xmlmodel/xforms:instances/instance" +
"/form_metadata/title/documentnbr[number]";
Maalesef işe yaramıyor ve sürekli olarak null bir getiri elde ediyorum.
here, here ve here kodlarını okudum, ancak bu çalışma için bana yardımcı olacak hiçbir şey yeterince aydınlanmadı.
Bunu anladığımda yüz-avuç için gideceğimden neredeyse neredeyse eminim ama neyi kaçırdığımı bilmiyorum.
Tüm bunları okuduğunuz için teşekkürler ve yardım için şimdiden teşekkürler.
-Andy
mükemmel çözüm, hala oldukça ad alanlarını anlamıyorum ama en durumunda açıkça bunu kullanabileceğiniz ek ad alanlarını tanımlamak gerekir En azından kod şimdi çalışıyor. Çok teşekkürler. – MrWizard54
@ Jason: "Bir sebepten dolayı ifadede herhangi bir isim kullanmak zorunda kalmadım." Standart Java uygulamasında, DocumentBuilderFactory varsayılan olarak namespace-_unaware_ ayrıştırıcıları üretir. DocumentBuilder'i oluşturmadan önce 'dbfac.SetNamespaceAware (true)' ifadesi, sonuçları değiştirebilir. –