不使用Parse从XML字符串创建节点

时间:2011-07-25 15:56:00

标签: xml groovy

我有一个函数,它接收一个ODataObject,其中包含从消息总线触发的事件中的一些XML。我正在编写测试用例来检查我的函数如何处理来自仅由此组成的消息总线的XML:<?xml version="1.0" encoding="UTF-8"?>

这就是我创建传递给其他测试用例的DataObject的方法

final Document document = DOMUtil.parse(TestEventXML)  
final DataObject dataObject = new ODataObject(document.getDocumentElement())  
myListener.onMessage(dataObject)

但是,将上述字符串作为TestEventXML传入会返回以下错误:

java.lang.NullPointerException: Cannot invoke method getDocumentElement() on null object

因为在格式不正确的XML字符串上调用DOMUtil.parse()将返回null。

所以,我需要做一些工作,这样我就可以创建一个org.w3c.dom.Node,我可以从我创建的XML字符串中传递给ODataObject的构造函数。任何想法,建议等都将不胜感激。

编辑 - 问题摘要

为了澄清,我知道我试图传入的字符串只是没有内容的XML文件的标题。但有时这是通过消息总线传递的,所以我需要测试我的函数是否正确处理它。我的函数确实有代码来处理格式错误的XML,所以我的问题不是如何检查XML是否格式错误。问题是我需要创建一个DataObject来测试我正在正确处理它。但我无法使用格式错误的XML创建DataObject,因为parse返回null。

编辑2 - 我目前如何处理格式错误/空XML

在我的onMessage函数中,我在传入的DataObject上调用toString方法,该方法返回DataObject中的XML字符串。然后,为了创建groovy.util.Node对象,我尝试new XmlParser().parseText(xmlString)并捕获所有SAXParseExcetions,这是由于格式错误的XML或null。然后onMessage函数返回,跳过函数其余部分的所有解析代码。

附录 - 可能回答我原来问题的另一个问题 org.w3c.dom.Node是一个界面,所以我不能只做new 0DataObject(new Node())。有没有办法创建一个Node并将正确的属性设置为我的XML String?

如果您有任何问题,请发表评论。

2 个答案:

答案 0 :(得分:2)

修复工作原理:使用Groovy的MockFor类创建ODataObject的模拟。在创建DataObject时,我传递格式正确的XML。但是,当调用ODataObject的{​​{1}}函数时,我会拦截它并返回格式错误的XML。

我将尝试查看Platinum Azure的建议,看看我正在收听的消息总线如何构建ODataObject,以确定它为什么返回toString字符串。

答案 1 :(得分:1)

我可能错了,但我觉得你正试图解决错误的问题。我想我不确定为什么你不能手动构建节点,甚至当你知道XML不好时你甚至需要构建节点的原因。

如果您正在等待有问题的消息总线中的更多信息,并且您可以控制传入数据的架构,那么您可能应首先发送内容长度,然后等待那么多数据再尝试做XML解析工作?由于XML是一种基于平衡节点的无上下文语法,因此尝试在内存中构造XML文档而不包含每个最后一个字节(包括关闭根标记)确实不是一个好主意。

否则,如果您只需要处理null,请考虑使用null object pattern