使用库来操纵XML是否至关重要?

时间:2020-03-05 18:42:32  来源:igfitidea点击:

我正在使用Java后端来创建传递给浏览器的XML字符串。目前,我正在使用简单的字符串操作来生成此XML。我必须使用Java中的一些XML库来生成XML字符串吗?
与我所需的库相比,我发现这些库非常难以使用。

解决方案

回答

否如果我们可以自己解析(如我们所做的那样),并且可以根据需要进行扩展,则不需要任何库。

只需确保将满足未来需求,使用库中的一些库也具有非常简单的风格就可以更好地完成复杂的xml创建。

回答

我认为自定义字符串操作很好,但是我们必须牢记两点:

  • 代码不如库成熟。在计划中分配时间来处理弹出的错误。
  • 当xml开始增长时(在性能和易用性方面),方法可能不会像第3方库那样扩展。

我知道一个使用自定义字符串操作进行xml输出的代码库(以及用于输入的第3方库)。刚开始时很好,但是过了一会儿就变成了一个真正的麻烦。

回答

是的,使用图书馆。

有人花费时间和精力来创建通常比我们能想到的更好的东西。字符串操作用于发送回单个节点,但是一旦我们开始需要操作DOM或者使用XPath查询,该库将为我们节省。

回答

尤其是对于生成(解析,我不太愿意这样做,因为输入文本总会给我们带来惊喜)。我认为这很好,但是如果我们发现自己花更多时间维护自己的代码,则准备转移到库。

回答

我不认为使用JDK附带的DOM XML API很困难,创建元素节点,属性等很容易,后来又很容易将字符串转换为DOM文档或者将DOM文档转换为String

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

回答

这不是必需的,但建议。但是,如果字符串操作对我们有用,那就去吧!在很多情况下,可以手动安全地构建小的或者简单的XML文本。

请注意,创建XML文本比看起来困难。这是我要考虑的一些标准:

  • 第一:我们对进入xml的信息有多少控制权?

我们对源数据的控制越少,遇到麻烦的可能性就越大,并且库变得越有优势。例如:(a)我们可以保证元素名称中永远不会包含名称中非法的字符吗? (b)属性内容中的引号怎么样?它们会发生吗,我们在处理它们吗? (c)数据中是否包含任何可能需要编码为实体的东西(例如小于的东西,通常需要将其输出为<);你做得对吗?

  • 第二,可维护性:构建XML的代码是否易于他人理解?

我们可能不想被一生的代码所困扰。我使用过的二手C ++代码可以手工构建XML,而且它可能令人惊讶地晦涩难懂。当然,如果这是个人项目,则无需担心"其他":用"一年内"代替上面的"其他"。

我不会担心性能。如果XML非常简单,可以手工编写,那么库中的任何开销可能就没有意义了。当然,情况可能有所不同,但是我们应该先进行证明。

最后,是的;如果足够简单,我们可以手工构建XML文本;但不知道可用的库可能不是正确的原因。

现代的XML库是一个非常强大的工具,但它也可能令人生畏。但是,学习XML库的基本知识并不难,而且非常方便。除其他外,这几乎是当今就业市场中的必备条件。除非我们掌握了基本知识,否则不要被命名空间,架构和其他高级功能所困扰。

祝你好运。

回答

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

我们必须处理诸如正确的编码,属性编码(例如,产生无效的xml),正确的CDATA转义,UTF编码,自定义DTD实体之类的事情,而不必使用默认的/空的命名空间,命名空间属性来混入xml命名空间。 , 等等。

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

回答

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

回答

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

回答

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

回答

是的。

跳过必要的工具是没有道理的:即使编写xml也很重要,因为必须转义那些与号和lts,更不用说名称空间绑定了(如果需要)。
最后,库通常不仅可以更可靠地读取和写入xml,而且可以更有效地读取(尤其是Java)。

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