有关String转化为Xml的Document出现的问题?(300分相赠)

hillfree 2004-01-07 06:32:08
有关String转化为Xml的Document出现的问题?

注意:请看完问题再回复,不要一看题目就去找来不适合的源码贴上来。

问题:“从xml文件生成的Document”和“从String转化的Document”在xpath应用上不同!

我用java编写Ejb,因为要把最终的函数发布为Web服务,所以接口采用了String作为输入参数,在内部处理时,首先把String转化为org.w3c.dom.Document对象。转换所用的代码见附录A。

问题是这种方式生成的Document在Xpath调用时不能正常工作。对于比较简单的xpath(比如/*, /*[1]/*[3])之类的还可以,可是对于比较复杂一点点的就不行了。比如( "//WfMessageBody/*[contains(name(), 'Request')]",“/WfMessage/WfMessageBody/*[1]”)。

而同样的调用,在从xml文件生成的Document对象上可以正常工作。(当然,除了Document生成过程之外,其他一切代码都一样)

请教各位大师该如何处理?或者给出一个String转化Document更好的实现方法。欢迎探讨建议。解决后,奉上300分。

注意:(1) 因为要在EJB中用,那种从xml文件load的方案是不可以的。

附录A:
/**
* 把一个Xml字符串转换成一个Xml文档文件。
* @param strXml Xml文档字符串
* @return Document,如果出错返回空。
*/

public org.w3c.dom.Document xmlString2Doc(String strXml) {
Document ret = null;
try {
// Create a builder factory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false);

// Create the builder and parse the file
ret = factory.newDocumentBuilder().parse(new InputSource(new
StringReader(strXml)));
}
catch (Exception e) {
e.printStackTrace();
}
return ret;
}
...全文
315 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jonathan_yun 2004-04-08
  • 打赏
  • 举报
回复
帮你顶!!!
各位大虾大显身手吧!
programer23 2004-04-08
  • 打赏
  • 举报
回复
关注了
zhutg 2004-04-08
  • 打赏
  • 举报
回复
我用的jdom带的sax解析器实现你所说:
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(new StringReader(strXml));
。。。。。。。
String reply = doc.getRootElement().getChildText("ReplyToKey");
。。。。。。。
很简单的。
hillfree 2004-01-12
  • 打赏
  • 举报
回复
没人关心这个Bug?
hillfree 2004-01-08
  • 打赏
  • 举报
回复
to gong1(轻松编程):

上面给出的String2Doc的方法是参照JavaAlamanic里面的参考实现写的。用了很久了,因为近期做比较细致和大量的Xpath工作,才发现用上面方法生成的Document在Xpath方面只能对非常有限的Xpath表达式正常工作。

JDom用过,那个和Dom4j是一回事情吗?

---------------
附录B, 我所用的xml文件

<?xml version="1.0" encoding="GB2312"?>
<WfMessage Version="1.0" xmlns="http://www.wfmc.org/standards/docs/Wf-XML">
<WfTransport>
<Dialog MessageID="消息ID号UUID" Mode="individual" Type="synch">
<ReplyToKey>服务请求者URI</ReplyToKey>
<Credential>类似于密码的东东</Credential>
</Dialog>
</WfTransport>
<WfMessageHeader>
<Request RequestID="请求ID号UUID" ResponseLang="zh" ResponseRequired="Yes"/>
<Key>具体请求的服务提供者SP_URI</Key>
</WfMessageHeader>
<WfMessageBody>
<CreateProcessInstance.Request>
<ContextData> <Parameter Name="参数名">参数内容Shaohua</Parameter>
</ContextData>
</CreateProcessInstance.Request>
</WfMessageBody>
</WfMessage>

--------------
附录C 用到的Xml的String版

String req = "<?xml version=\"1.0\" encoding=\"GB2312\"?>" +
"<WfMessage xmlns=\"http://www.wfmc.org/standards/docs/Wf-XML\" Version=\"1.0\">" +
"<WfTransport>" +
"<Dialog Type=\"synch\" Mode=\"individual\" MessageID=\"消息ID号UUID\">" +
"<ReplyToKey>服务请求者URI</ReplyToKey>" +
"<Credential>类似于密码的东东</Credential>" +
"</Dialog>" +
"</WfTransport>" +
"<WfMessageHeader>" +
"<Request ResponseRequired=\"Yes\" ResponseLang=\"zh\" RequestID=\"请求ID号UUID\"/>" +
"<Key>具体请求的服务提供者SP_URI</Key>" +
"</WfMessageHeader>" +
"<WfMessageBody>" +
"<CreateProcessInstance.Request>" +
"<ContextData> <Parameter Name=\"参数名\">参数内容Shaohua</Parameter></ContextData>" +
"</CreateProcessInstance.Request>" +
"</WfMessageBody>" +
"</WfMessage>";
gong1 2004-01-07
  • 打赏
  • 举报
回复
为什么不用dom4j来处理。
关注
gz

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧