我在一个字符串中有一个完整的XML文档,并且想要一个Document对象.谷歌出现了各种各样的垃圾.什么是最简单的解决方案?(在Java 1.5中)
解决方案感谢Matt McMinn,我已经确定了这个实现.它具有适当级别的输入灵活性和异常粒度.(很高兴知道错误是来自格式错误的XML SAXException- 或者只是错误的IO - IOException.)
public static org.w3c.dom.Document loadXMLFrom(String xml)
throws org.xml.sax.SAXException, java.io.IOException {
return loadXMLFrom(new java.io.ByteArrayInputStream(xml.getBytes()));
}
public static org.w3c.dom.Document loadXMLFrom(java.io.InputStream is)
throws org.xml.sax.SAXException, java.io.IOException {
javax.xml.parsers.DocumentBuilderFactory factory =
javax.xml.parsers.DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
javax.xml.parsers.DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
}
catch (javax.xml.parsers.ParserConfigurationException ex) {
}
org.w3c.dom.Document doc = builder.parse(is);
is.close();
return doc;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Java Servlet创建RESTful Web服务.问题是我必须通过POST方法传递给Web服务器请求.此请求的内容不是参数,而是正文本身.
所以我基本上从ruby发送这样的东西:
url = URI.parse(@host)
req = Net::HTTP::Post.new('/WebService/WebServiceServlet')
req['Content-Type'] = "text/xml"
# req.basic_auth 'account', 'password'
req.body = data
response = Net::HTTP.start(url.host, url.port){ |http| puts http.request(req).body }
Run Code Online (Sandbox Code Playgroud)
然后我必须在我的servlet中检索此请求的主体.我使用经典的readline,所以我有一个字符串.问题是我必须将其解析为XML:
private void useXML( final String soft, final PrintWriter out) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException, FileNotFoundException {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(soft);
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//software/text()");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList …Run Code Online (Sandbox Code Playgroud) 我一直在反对这一点,并开始取得进展.但是,我遇到了将SAML 2 Assertion(在XML中)的字符串表示形式转换为Assertion对象的问题.
看起来我正在org.w3c.dom.Document使用适当的数据获得有效数据,而且我似乎SAMLObjectBuilder<Assertion>从构建器工厂获得了有效数据,但是当我尝试将它们放在一起时,我得到的只是一个空白的断言; 主题,发行人,发行时间等都是null,尽管它们明确地在XML中设置.
有谁看到我做错了什么,并建议一个解决方案?
Document doc = loadXMLFromString(saml);
XMLObjectBuilderFactory builderFactory = Configuration.getBuilderFactory();
SAMLObjectBuilder<Assertion> assertionBuilder =
(SAMLObjectBuilder<Assertion>)
builderFactory.getBuilder(Assertion.DEFAULT_ELEMENT_NAME);
Assertion assertion = assertionBuilder.buildObject(doc.getDocumentElement());
String nameID = assertion.getSubject().getNameID().getValue();
Run Code Online (Sandbox Code Playgroud)
在nameID赋值处,assertion.getSubject()返回null,使表达式的其余部分失败.
我使用的示例是来自sstc-saml-tech-overview-2.0-draft-03,第10页的完整XML.
loadXMLFromString()上面的函数主要是从In Java借来的,我如何将XML解析为String而不是文件?