![](/img/trans.png)
[英]How to get Node from XML without considering namespace name in Java?
[英]XML DOM: Selecting a node with namespace by name
我閱讀了經過簽名的XML格式:
<?xml version="1.0" encoding="UTF-8"?><principal><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><ds:Reference URI="#1500-Fri Jan 30 19:11:38 BOT 2015"><ds:Transforms>s:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><ds:DigestValue>YOzKDc7CB3QvedYMF2ZBB6omlsg=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>DLZKHySIMKwFuB1wc8cR7w/UbLhYyZtul/ndFch1GCeiKrmohyNOGO82Hbcm+rFEWxK1yMx2sKtMKnuPTTCnIiZaYCLax5UJUe27AVqzpHZOc7+UKBmQoOOi3gYfAuyCZX5xBv0lrFNuigoNv6b0Z00Bu5Eu5e2zf01zceUqig40Y3yWUpEVRl+nbEUmVEBT+8fFwcigIQhqMbwFftGO8mcu55VKbGmMZS7cpwzfq+PsTrnDDHbZ9cme/8p3lWo8TGTEDTcQ2HZoSI5VAPR2/fGDGKtS5PEG0Vbb0WFdVZ+PKuOAhXqiP947xi6PP6Qv1bCbUqwsNLwTfuTjNR9lGg==</ds:SignatureValue><ds:KeyInfo><ds:KeyName>1500</ds:KeyName></ds:KeyInfo><ds:Object Id="1500-Fri Jan 30 19:11:38 BOT 2015"><SER><num>150049</num><cod>HJYafrtr3456ABDFG</cod><pais>BO</pais</SER></ds:Object></ds:Signature><Otro>Imagen</Otro></principal>
從Java中讀取:
DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
NodeList signatures =
doc.getElementsByTagNameNS(Constants.SignatureSpecNS ,"ds:Signature");
System.out.println("the length "+ signatures.getLength());
返回“ signatures.getLength()” = 0,我嘗試使用:
NodeList signatures = doc.getElementsByTagNameNS(Constants.SignatureSpecNS ,"ds");
NodeList signatures = doc.getElementsByTagNameNS(Constants.SignatureSpecNS ,"Signature");
可以讀取標簽<ds:Signature>
。 如何選擇此簽名節點?
首先,提供的XML輸入仍然無效。 我必須編輯ds:Transform
才能獲得有效的文檔。 現在看起來像這樣:
<?xml version="1.0" encoding="UTF-8"?>
<principal>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#1500-Fri Jan 30 19:11:38 BOT 2015">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>YOzKDc7CB3QvedYMF2ZBB6omlsg=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>DLZKHySIMKwFuB1wc8cR7w/UbLhYyZtul/ndFch1GCeiKrmohyNOGO82Hbcm+rFEWxK1yMx2sKtMKnuPTTCnIiZaYCLax5UJUe27AVqzpHZOc7+UKBmQoOOi3gYfAuyCZX5xBv0lrFNuigoNv6b0Z00Bu5Eu5e2zf01zceUqig40Y3yWUpEVRl+nbEUmVEBT+8fFwcigIQhqMbwFftGO8mcu55VKbGmMZS7cpwzfq+PsTrnDDHbZ9cme/8p3lWo8TGTEDTcQ2HZoSI5VAPR2/fGDGKtS5PEG0Vbb0WFdVZ+PKuOAhXqiP947xi6PP6Qv1bCbUqwsNLwTfuTjNR9lGg==</ds:SignatureValue>
<ds:KeyInfo>
<ds:KeyName>1500</ds:KeyName>
</ds:KeyInfo>
<ds:Object Id="1500-Fri Jan 30 19:11:38 BOT 2015">
<SER>
<num>150049</num>
<cod>HJYafrtr3456ABDFG</cod>
<pais>BO</pais>
</SER>
</ds:Object>
</ds:Signature>
<Otro>Imagen</Otro>
</principal>
以下代碼似乎可以解決您遇到的問題。
public static void Foo()
{
try
{
File file = new File("YourFile.xml");
if (file.exists() == true)
{
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbFactory.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
NodeList signatures = doc.getElementsByTagName("ds:Signature");
System.out.print(signatures.getLength());
Node signatureNode = signatures.item(0);
NodeList childNodes = signatureNode.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++)
{
System.out.print(childNodes.item(i));
}
}
}
catch (Exception exception)
{
// Swallow exception
}
}
請注意,我真正改變的一切都改變了:
NodeList signatures = doc.getElementsByTagNameNS(Constants.SignatureSpecNS ,"ds:Signature");
對此:
NodeList signatures = doc.getElementsByTagName("ds:Signature");
我希望這有幫助。
您需要指定此代碼生成的解析器將提供對XML名稱空間的支持並使用正確的url。
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
dbFactory.setValidating(true);
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
String docNS = "http://www.w3.org/2000/09/xmldsig#";
Element principal = doc.getDocumentElement();
NodeList signatures = principal.getElementsByTagNameNS(docNS ,"Signature");
System.out.println("the length "+ signatures.getLength());
希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.