我读了一个签名的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());
返回&#34; signatures.getLength()&#34; = 0,我试过:
NodeList signatures = doc.getElementsByTagNameNS(Constants.SignatureSpecNS ,"ds");
NodeList signatures = doc.getElementsByTagNameNS(Constants.SignatureSpecNS ,"Signature");
可以读取标记<ds:Signature>
。如何选择此签名节点?
答案 0 :(得分:0)
首先,提供的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");
我希望这会有所帮助。
答案 1 :(得分:0)
您需要指定此代码生成的解析器将提供对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());
希望有所帮助。