2015-02-20 2 views
2

Я прочитал XML, подписанный и поставляется в виде:XML DOM: Выбор узла с пространством имен по имени

<?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>. Как выбрать этот узел подписи?

+0

Вероятно, это то, что вы ищете: http://stackoverflow.com/questions/13623505/xml-parser-for-colon-separated-tags http://stackoverflow.com/questions/ 21785054/how-to-parse-a-xml-with-colons-in-some-tags – esin88

+1

Ваш XML некорректен. Я вставил его в валидатор по адресу http://www.w3schools.com/xml/xml_validator.asp и произошла синтаксическая ошибка. Ничто другое не будет работать без правильного XML. – skaffman

+1

** BO ** - здесь «>» отсутствует. – mkl

ответ

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"); 

Я надеюсь, что это помогает.

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()); 

Надеюсь, что это поможет.

Смежные вопросы