Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java xml文档和签名中的名称空间_Java_Xml_Document_Signature - Fatal编程技术网

Java xml文档和签名中的名称空间

Java xml文档和签名中的名称空间,java,xml,document,signature,Java,Xml,Document,Signature,xml中的名称空间存在问题 我有一个类似于: <?xml version="1.0" encoding="WINDOWS-1251" standalone="no"?> <XmlRoot xmlns="some-namespace"> <Element1 xmlns="some-namespace">...</Element1> <El

xml中的名称空间存在问题

我有一个类似于:

<?xml version="1.0" encoding="WINDOWS-1251" standalone="no"?>
<XmlRoot xmlns="some-namespace">
  <Element1 xmlns="some-namespace">...</Element1>
  <Element2 xmlns="some-namespace">...</Element2>
  <Element1 xmlns="some-namespace">...</Element1>
</XmlRoot> 

...
...
...
我需要对每个元素进行签名,并在其中添加签名,如:

<Element1 xmlns="some-namespace"><SignatureHere>BLAH_BLAH_BLAH_SIGNED</SignatureHere></Element1>
废话废话废话
要做到这一点,我需要将所有Element1(例如)数据提取为xml,对其签名,然后放入其中

但是,当我使用Transformer和DOMSource转换就绪文档时(它以不同的方式格式化xml),它会从XmlRoot的子节点删除所有XmlN:

<?xml version="1.0" encoding="WINDOWS-1251" standalone="no"?>
<XmlRoot xmlns="some-namespace">
  <Element1><SignatureHere>BLAH_BLAH_BLAH_SIGNED</SignatureHere>...</Element1>
  <Element2><SignatureHere>BLAH_BLAH_BLAH_SIGNED</SignatureHere>...</Element2>
  <Element1><SignatureHere>BLAH_BLAH_BLAH_SIGNED</SignatureHere>...</Element1>
</XmlRoot> 

废话废话废话签名。。。
废话废话废话签名。。。
废话废话废话签名。。。
所以签名不能被正确地更改。 所以这里有一个问题:孩子们是否有能力保持名称空间的活力? 或者是否能够从节点中正确删除它们? 附言:别问我,为什么我不能在整个文件上签字(()())) 谢谢你的建议

[UPD] 最简单的例子:

公共布尔验证(字符串xml){
文档=解析文档(xml);
NodeList NodeList=document.getDocumentElement().getChildNodes();
列表节点=convertToList(nodeList);//收集到列表
List signatures=new ArrayList();//这只是个例子。实际上
//有一个对象列表,其中包含此信息
nodes.forEach(节点->{
List childNodes=convertToList(node.getChildNodes());
节点签名=childNodes.stream()
.filter(n->“SignatureHere”.equalsIgnoreCase(n.getLocalName()))
.filter(n->“签名\名称空间”.equalsIgnoreCase(n.getNamespaceURI()))
.findFirst()
.orelsetrow(()->new RuntimeException(“给定节点没有要验证的符号”);
String signInBase64=signature.getTextContent();
签名。添加(签名栏64);
node.removeChild(签名);
});
对于(int i=0;i{
文档节点文档=
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Node importedNode=nodeDocument.importNode(Node,true);
nodeDocument.appendChild(导入节点);
字符串nodeXml=toString(nodeDocument,true);//这将是
//签署;
String signInBase64=signService.sign(nodeXml);//签名的某个供应商服务
//xml并返回base64版本的
//标志,所以对我们来说是黑匣子
Element signElement=node.getOwnerDocument().CreateElements(“签名\命名空间”,
“签字人”);
signElement.setTextContent(signInBase64);
signElement.setPrefix(“dsig”);
//添加到节点
node.appendChild(signElement);
//设置为第一个元素
Node firstChild=Node.getFirstChild();
if(firstChild!=null){
node.insertBefore(signElement,firstChild);
}
});
//文档的节点已更新
返回字符串(文档,假);
}
公共字符串toString(文档文档,布尔省略XMLDeclaration)引发RuntimeException{
Transformer Transformer=createTransformer();
transformer.setOutputProperty(OutputKeys.STANDALONE,“是”);
if(省略XML声明){
setOutputProperty(OutputKeys.OMIT_XML_声明,“yes”);
}
试一试{
Writer-Writer=新的StringWriter();
transform(新的DOMSource(文档)、新的StreamResult(writer));
返回writer.toString();
}捕获(转换异常e){
抛出新的运行时异常(e);
}
}
私有字符串nodeToXmlString(节点节点){
试一试{
文档节点文档=
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Node importedNode=nodeDocument.importNode(Node,true);
nodeDocument.appendChild(导入节点);
返回字符串(nodeDocument,true);
}捕获(例外e){
抛出新的运行时异常(e);
}
}
专用变压器createTransformer(){
试一试{
TransformerFactory TransformerFactory=TransformerFactory.newInstance();
transformerFactory.setFeature(xmlstants.FEATURE\u SECURE\u PROCESSING,true);
返回transformerFactory.newTransformer();
}捕获(TransformerConfiguration异常e){
抛出新的非法状态异常(e);
}
}
私有列表转换器列表(节点列表节点列表){
列表结果=新建ArrayList();
for(int i=0;i
尽可能简单地编写示例。

Ple