我使用Java后端创建传递给浏览器的XML字符串。目前我正在使用简单的字符串操作来生成此XML。我是否必须在Java中使用一些XML库来生成XML字符串? 我发现与我需要的库相比,这些库很难使用。
答案 0 :(得分:11)
这不是必要的,但是可取的。但是,如果字符串操作适合您,那就去吧!在很多情况下,可以手动安全地构建小型或简单的XML文本。
请注意,创建XML文本比看起来更难。这是我要考虑的一些标准:
您对源数据的控制越少,您遇到麻烦的可能性就越大,并且库变得越有利。例如:(a)你可以保证元素名称永远不会有名字中的非法字符吗? (b)属性内容中的引号怎么样?他们会发生,你在处理它们吗? (c)数据是否包含可能需要编码为entity的任何内容(如通常需要输出为& lt; 的小于);你正确地做到了吗?
你可能不想被生活中的代码所困扰。我使用过手工构建XML的二手C ++代码,它可能令人惊讶地模糊不清。当然,如果这是你的个人项目,那么你不必担心“其他人”:用“一年”代替上面的“其他人”。
我不担心性能。如果您的XML足够简单,您可以手写它,那么库中的任何开销都可能毫无意义。当然,您的情况可能有所不同,但您应该先测量以证明它。
最后,是的;如果它足够简单,你可以手工构建XML文本;但不知道可用的库是可能不正确的原因。
现代XML库是一个非常强大的工具,但它也可能令人生畏。但是,学习XML库的基本知识并不是那么难,而且它可以非常方便;除此之外,它几乎是当今就业市场的必需品。在获得必需品之前,不要陷入名称空间,模式和其他更高级功能的困境。
祝你好运。答案 1 :(得分:7)
Xml很难。解析自己是一个坏主意,自己生成内容甚至更糟糕。看看Xml 1.1规范。
你必须处理诸如正确的编码,属性编码(例如,产生无效的xml),正确的CDATA转义,UTF编码,自定义DTD实体之类的事情,并且没有使用默认/空命名空间抛出混合xml命名空间,命名空间属性等。
学习一个工具包,有很多可用的工具。
答案 2 :(得分:3)
我认为自定义字符串操作很好,但你必须牢记两件事:
我知道一个代码库,它使用自定义字符串操作来输出xml(以及第三方库用于输入)。一开始很好,但过了一段时间后变成了一个真正的麻烦。
答案 3 :(得分:2)
是的,请使用该库。
有人花时间和精力去创造通常比你想象的更好的东西。字符串操作用于发送回单个节点,但是一旦您开始需要操作DOM或使用XPath查询,库就会保存您。
答案 4 :(得分:2)
如果不使用库,则可能会生成或解析格式不正确的数据,这些数据迟早会发生 。出于同样的原因,在XHTML中不允许document.write
,您不应将XML标记编写为字符串。
答案 5 :(得分:2)
是
跳过基本工具是没有意义的:即使编写xml也是非常重要的,不得不逃避那些&符号,更不用说命名空间绑定(如果需要)。 最后,libs通常可以更可靠地读写xml,但效率更高(尤其是Java)。
但如果它们看起来过于复杂,你可能一直在寻找错误的工具。使用JAXB或XStream进行数据绑定很简单;但对于简单的直接XML输出,我选择StaxMate。它实际上可以通过多种方式简化任务(自动关闭开始标记,如果需要则写入名称空间声明等)。
答案 6 :(得分:1)
不 - 如果您可以自己解析(就像您正在做的那样),它会根据您的需求进行扩展,您不需要任何库。
确保您的未来需求得到满足 - 使用库可以更好地完成复杂的xml创建 - 其中一些也非常简单。
答案 7 :(得分:1)
您不必使用库来解析XML,但请查看此问题
What considerations should be made before reinventing the wheel?
在开始编写自己的代码以解析/生成xml之前。
答案 8 :(得分:1)
我在生产代码中唯一一次做过类似的事情就是当一个同事和我构建了一个预处理器,以便我们可以将来自其他文件的XML片段嵌入到更大的XML中。在加载时,我们首先解析这些嵌入(XML注释字符串中的文件引用),并用它们引用的实际片段替换它们。然后我们将合并的结果传递给XML Parser。
答案 9 :(得分:0)
不 - 特别是对于生成(解析我不太倾向于因为输入文本总是让你感到惊讶)。我认为它很好 - 但是如果你发现自己花费了几分钟来维护自己的代码,那么准备转移到图书馆。
答案 10 :(得分:0)
我认为使用JDK附带的DOM XML API并不困难,因此很容易创建Element节点,属性等......后来很容易将字符串转换为DOM文档,将DOM文档转换为串
在第一页google发现来自西班牙(spanish XML example):
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;
}