代码之家  ›  专栏  ›  技术社区  ›  Adrian Kiesthardt

在Java中将DOM节点呈现为字符串而不指定名称空间

  •  1
  • Adrian Kiesthardt  · 技术社区  · 6 年前

    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;
    }
    

    为了保持代码的可测试性,是否有一个必须设置的选项或绕过XML名称空间声明的方法?

    否则,我将尝试模拟一些函数,以诱使转换器无论如何呈现元素,但我不建议这是一个方便的选项。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Adrian Kiesthardt    6 年前

    最终我发现没有办法省略名称空间检查,但是为了测试,我找到了一个折衷方法,在测试时添加名称空间。

    @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");
    }
    

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