在不指定Java名称空间的情况下,将DOM节点呈现为字符串

时间:2018-09-17 14:44:29

标签: java xml dom

我的一个使用Java的项目需要基于抽象表示输出XML,该抽象表示建模为自己的类/数据类型。考虑此功能

public static String renderToString(Node element) {
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = null;
    try {
        transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    }
    DOMSource source = new DOMSource(element);
    StreamResult result = new StreamResult(new StringWriter());
    try {
        transformer.transform(source, result);
    } catch (TransformerException e) {
        e.printStackTrace();
    }
    return result.getWriter().toString();
}

我编写了一个测试,该测试构造了一个等效于

的元素
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR=";" MAX_LENGTH="8000" COLLATION="SQL_Latin1_General_CP1_CI_AS" />

这是由以下函数生成的

public static Element createFieldElement(Document doc) {
    Element fieldElement = doc.createElement("FIELD");
    ...
    fieldElement.setAttribute("xsi:type", "CharTerm");
    return fieldElement;
}

将此元素传递给函数,我现在收到一条错误消息,告诉我缺少“ xsi”名称空间(该名称空间与xsi:type属性一起使用),这是有道理的,因为我尝试渲染的元素不是完整的XML文档。

是否有必须设置的选项或以任何方式绕过XML命名空间声明以保持我的代码可测试?

否则,我将尝试模拟一些函数以欺骗“变形金刚”以无论如何渲染元素,但我不建议使用这种方便的选项。

1 个答案:

答案 0 :(得分:0)

最终,我找不到忽略命名空间检查的方法,但是为了进行测试,我在测试时添加了命名空间,从而找到了一种折衷办法。

@Test
public void IfColumnDescriptionGivenThenGenerateAccordingField() {
    Element element = XSDCreator.createFieldElement(doc, 1, ";");
    element.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
    String output = XSDCreator.renderToString(element);
    assertEquals(output, "Here comes the output");
}

这可能不是真实的输出,但是对于测试目的应该足够了。另一种方法是生成带有适当名称空间声明的文档,然后呈现整个文档。