簡體   English   中英

XML DOM:通過名稱選擇具有名稱空間的節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM