我正在使用 Java 后端创建传递到浏览器的 XML 字符串。目前我正在使用简单的字符串操作来生成此 XML。我是否必须使用 Java 中的某些 XML 库来生成 XML 字符串?我发现与我需要的相比,这些库很难使用。

有帮助吗?

解决方案

这不是必需的,但建议这样做。但是,如果字符串操作适合您,那就去做吧!在很多情况下,可以安全地手动构建小型或简单的 XML 文本。

请注意,创建 XML 文本比看起来更难。以下是我会考虑的一些标准:

  • 第一的:多少 控制 你有 xml 中的信息吗?

您对源数据的控制越少,遇到麻烦的可能性就越大,而图书馆就变得越有利。例如:(一)你可以吗 保证 元素名称中永远不会有非法字符?(b) 属性内容中的引号怎么样?它们会发生吗?你正在处理它们吗?(c) 数据是否包含任何可能需要编码为 实体 (就像小于经常需要输出为 <);你做对了吗?

  • 二、可维护性:构建 XML 的代码是否易于理解 由别人?

您可能不想终生受困于代码。我曾经使用过手动构建 XML 的二手 C++ 代码,但它可能令人惊讶地晦涩难懂。当然,如果这是你的个人项目,那么你不需要担心“其他”:将上面的“其他”替换为“一年内”。

我不会担心性能。如果您的 XML 足够简单,您可以手写它,那么来自库的任何开销可能都是毫无意义的。当然,您的情况可能会有所不同,但您应该首先采取措施来证明这一点。

最后,是的;如果足够简单,您可以手动构建 XML 文本;但不知道可用的库是 大概 不是正确的理由。

现代 XML 库是一个非常强大的工具,但它也可能令人畏惧。然而,学习 XML 库的基本知识并不难,而且非常方便。除其他外,这几乎是当今就业市场的必备条件。在掌握必要的知识之前,不要被命名空间、模式和其他更高级的功能所困扰。

祝你好运。

其他提示

Xml很难。解析自己是一个坏主意,自己生成内容甚至更糟糕。看看Xml 1.1规范。

你必须处理诸如正确的编码,属性编码(例如,产生无效的xml),正确的CDATA转义,UTF编码,自定义DTD实体之类的事情,并且没有使用默认/空命名空间抛出混合xml命名空间,命名空间属性等。

学习一个工具包,有很多可用的工具。

我认为自定义字符串操作很好,但你必须牢记两件事:

  1. 您的代码不像库那样成熟。在计划中分配时间来处理弹出的错误。
  2. 当xml开始增长时(无论是在性能还是易用性方面),您的方法可能无法像第三方库一样扩展。
  3. 我知道一个代码库,它使用自定义字符串操作来输出xml(以及第三方库用于输入)。一开始很好,但过了一段时间后变成了一个真正的麻烦。

是的,请使用该库。

有人花时间和精力去创造通常比你想象的更好的东西。字符串操作用于发送回单个节点,但是一旦您开始需要操作DOM或使用XPath查询,库就会保存您。

如果不使用库,则可能会生成或解析格式不正确的数据,这些数据迟早会发生 。出于同样的原因,XHTML中不允许使用 document.write ,因此不应将XML标记编写为字符串。

跳过基本工具是没有意义的:即使编写xml也是非常重要的,不得不逃避那些&符号,更不用说命名空间绑定(如果需要)。 最后,libs通常可以更可靠地读写xml,但效率更高(尤其是Java)。

但如果它们看起来过于复杂,你可能一直在寻找错误的工具。使用JAXB或XStream进行数据绑定很简单;但对于简单的直接XML输出,我使用 StaxMate 。它实际上可以通过多种方式简化任务(自动关闭开始标记,如果需要则写入名称空间声明等)。

不 - 如果您可以自己解析(就像您正在做的那样),它会根据您的需求进行扩展,您不需要任何库。

确保您的未来需求得到满足 - 使用库可以更好地完成复杂的xml创建 - 其中一些也非常简单。

我在生产代码中唯一一次做过类似的事情就是当一个同事和我构建了一个预处理器,以便我们可以将来自其他文件的XML片段嵌入到更大的XML中。在加载时,我们首先解析这些嵌入(XML注释字符串中的文件引用),并用它们引用的实际片段替换它们。然后我们将合并的结果传递给XML Parser。

您不必使用库来解析 XML,但请查看这个问题
重新发明轮子之前应该考虑哪些因素?
在开始编写自己的代码来解析/生成 xml 之前。

不 - 特别是对于生成(解析我不太倾向于因为输入文本总是让你感到惊讶)。我认为它很好 - 但是如果你发现自己花费了几分钟来维护自己的代码,那么准备转移到图书馆。

我认为使用JDK附带的DOM XML API并不困难,因此很容易创建Element节点,属性等等......后来很容易将字符串转换为DOM文档,将DOM文档转换为串

在第一页google发现来自西班牙(西班牙语XML示例 ):

public String DOM2String(Document doc)
{
    TransformerFactory transformerFactory =TransformerFactory.newInstance();
    Transformer transformer = null;
    try{
        transformer = transformerFactory.newTransformer();
    }catch (javax.xml.transform.TransformerConfigurationException error){
        coderror=123;
        msgerror=error.getMessage();
        return null;
    }

    Source source = new DOMSource(doc);

    StringWriter writer = new StringWriter();
    Result result = new StreamResult(writer);
    try{
        transformer.transform(source,result);
    }catch (javax.xml.transform.TransformerException error){
        coderror=123;
        msgerror=error.getMessage();
        return null;
    }

    String s = writer.toString();
    return s;
}

public Document string2DOM(String s)
{
    Document tmpX=null;
    DocumentBuilder builder = null;
    try{
        builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    }catch(javax.xml.parsers.ParserConfigurationException error){
        coderror=10;
        msgerror="Error crando factory String2DOM "+error.getMessage();
        return null;
    }
    try{
        tmpX=builder.parse(new ByteArrayInputStream(s.getBytes()));
    }catch(org.xml.sax.SAXException error){
        coderror=10;
        msgerror="Error parseo SAX String2DOM "+error.getMessage();
        return null;
    }catch(IOException error){
        coderror=10;
        msgerror="Error generando Bytes String2DOM "+error.getMessage();
        return null;
    }
    return tmpX;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top