2016-11-04 12 views
4

Я имею дело с XML-сигнатурой. Как вы знаете, существует три типа подписей XML: огибающие, обволакивающие, отсоединенные.Как извлечь «исходный» контент с помощью файла xml-подписанного

Я нашел хорошие учебники о том, как использовать стандартный API Java для подписи/проверки файла, но я хотел бы знать, как извлечь (почти) «исходные» данные контента. В частности:

1) После проверки Enveloped XML-подписанный файл, что является правильным способом «получить» содержимое XML без подписи?

2) После проверки Enveloping XML-подписанный файл, что такое правильный способ «получить» узел «Объект»?

Для «get» Я имею в виду писать на отдельный физический файл, очищая подпись (со стандартным API, если это возможно).

Вы заранее заблаговременно,

добрый.

Мирко

ответ

3

Enveloped подпись

<yourxml> 
    ... 
    <Signature>....</Signature> 
</yourxml> 

Сигнатура является узлом документа XML. После проверки XML-подписи найдите узел, удалите его из структуры DOM и сохраните документ.

// Instantiate the document to be signed. 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(xml)); 

// Find Signature element. 
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature"); 

//... XML Signature validation 

//remove signature node from DOM 
nl.item(0).getParentNode().removeChild(nl.item(0)); 

//write to file. 
OutputStream os = new FileOutputStream(outputFileName); 
TransformerFactory tf = TransformerFactory.newInstance(); 
Transformer trans = tf.newTransformer(); 
trans.transform(new DOMSource(doc), new StreamResult(os)); 

Enveloping подпись

<Signature> 
    <Object Id="object"> 
     <yourxml>...</yourxml> 
    </Object> 
</Signature> 

Вы могли бы применить ту же технику. Найдите узел Object и сохраните первый файл в файле. Но в этом случае XMLSignature предоставляет getObjects метод, чтобы получить подписанные объекты

//XMLSignature result of validation process 
XMLSignature signature = ... 

//Gets the node 
XMLObject xmlObject = (XMLObject)signature.getObjects().get(0); 
Node yourXmlNode = ((DOMStructure)xmlObject.getContent().get(0)).getNode(); 

//Save to file 
OutputStream os = new FileOutputStream(outputFileName); 
TransformerFactory tf = TransformerFactory.newInstance(); 
Transformer trans = tf.newTransformer(); 
trans.transform(new DOMSource(yourXmlNode), new StreamResult(os)); 
+0

Большое спасибо. Элегантное решение. – Mirko

1

В @pedrofb ответ на обволакивающей случае код работает, если данные объект XML-структуру. Однако у меня есть плоские данные в узле объекта, так что получить исходное содержание данных, используя аналогичную технику:

NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Object"); 
if (nl.getLength() == 0) { 
    throw new Exception("*** Cannot find Object element"); 
} 
final String data = nl.item(0).getTextContent(); 

try { 
    File target = new File("/path/output.dat"); 

    FileWriter writer = new FileWriter(target); 
    BufferedWriter bufferedWriter = new BufferedWriter(writer, 8192); 
    bufferedWriter.write(data); 

    //flush & close writers 
    //... 

} catch (Exception e) { 
    //... 

}