gpt4 book ai didi

java - 如何使用Java的DocumentBuilder获取XML注释

转载 作者:行者123 更新时间:2023-12-02 11:34:14 25 4
gpt4 key购买 nike

我有一个使用 SAML 身份验证的应用程序,充当 SP,因此解析 SAMLResponses。我收到通知,与我的应用程序通信的 IdP 现在将开始使用 http://www.w3.org/2001/10/xml-exc-c14n#WithComments 签署其 SAML 响应,这意味着在计算 SAML 签名的有效性时注释很重要。

问题就在这里 - 我用于 XML 解析的库默认会删除这些注释节点。请参阅此示例程序:

import org.apache.commons.io.IOUtils;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

public class Main {

public static void main(String[] args) {
try {
String xml = "<NameID>test@email<!---->.com</NameID>";
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(IOUtils.toInputStream(xml));
NodeList nodes = doc.getElementsByTagName("NameID");

if (nodes == null || nodes.getLength() == 0)
{
throw new RuntimeException("No NameID in document");
}

System.out.println(nodes.item(0).getTextContent());

} catch(Exception e) {
System.err.println(e.getMessage());
}
}
}

因此,该程序将打印 test@email.com (这意味着我的 SAML 代码也将得到该结果)。这是一个问题,因为我很确定它会导致签名验证在不包含注释的情况下失败,因为 XML 文档是使用 #WithComments 规范化方法进​​行签名的。

有没有办法让 DocumentBuilder/getTextContent() 留在注释节点中,这样我的签名就不会因缺少注释而失效?

getTextContent() 的文档位于:https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html#getTextContent()

最佳答案

您的代码实际上保留了注释。

这里稍微修改一下:

public static void main(String[] args) throws Exception {
String xml = "<NameID>test@email<!--foobar-->.com</NameID>";
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
NodeList childNodes = doc.getDocumentElement().getChildNodes();
Node[] nodes = new Node[childNodes.getLength()];
for (int index = 0; index < childNodes.getLength(); index++) {
nodes[index] = childNodes.item(index);
}
System.out.println(nodes[1].getTextContent());
}

打印foobar。 ( Run it on Ideone .)

根元素有3个子节点,其中一个是注释节点。所以它实际上被保留了。

关于java - 如何使用Java的DocumentBuilder获取XML注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49058314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com