jdom似乎删除重复的名称空间声明。当XML文档嵌入到另一个XML结构中时,例如在OAI-PHM(开放归档计划)中,这是一个问题。这可能是一个问题,当周围的XML只是一个容器和嵌入式文档被提取后。jdom删除重复的名称空间声明(xmloutputter)
这是一些代码。嵌入的xml包含在具有相同名称的字符串中。它声明了xsi命名空间。我们构造一个jdom容器,同时声明xsi命名空间。我们解析并嵌入字符串。当我们打印整个东西时,内部的xsi namepsace消失了。
public static final Namespace OAI_PMH= Namespace.getNamespace( "http://www.openarchives.org/OAI/2.0/");
public static final Namespace XSI = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
public static final String SCHEMA_LOCATION = "http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd";
public static final String ROOT_NAME = "OAI-PMH";
String embeddedxml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <myxml xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\""
+ "http://www.isotc211.org/2005/gmd"
+ " http://www.ngdc.noaa.gov/metadata/published/xsd/schema/gmd/gmd.xsd"
+ " http://www.isotc211.org/2005/gmx"
+ " http://www.ngdc.noaa.gov/metadata/published/xsd/schema/gmx/gmx.xsd\">\""
+ "</myxml>";
// loadstring omitted (parse embeddedxml into jdom)
Element xml = loadString(embeddedxml ,false);
Element root = new Element(ROOT_NAME, OAI_PMH);
root.setAttribute("schemaLocation", SCHEMA_LOCATION, XSI);
// insert embedded xml into container structure
root.addContent(xml);
XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());
// will see that the xsi namespace declaration from embeddedxml is gone
out.output(root,System.out);
我认为XMLoutputter负责这种行为。任何提示我如何使它保留重复的namepspace?
感谢
库尔特
为什么它会成为一个问题?如果名称空间实际上在嵌入式XML中使用,则在提取嵌入式XML时映射将“恢复”。 – 2011-03-29 08:46:15
确实。当元素移动到新文档时,任何XML API都会为您管理名称空间声明。 JDOM在删除重复的定义方面非常正确。 – skaffman 2011-03-29 09:06:56
问题似乎是提取。 AFAIK大多数OAI收获者的行为方式是,他们只是在字符串级别“剪切”嵌入的xml,也就是说,XML不会被解析。因此它不了解XML结构和名称空间。在我的例子中,你会发现将会有一个xsi:schemaLocation = ..如果你从容器结构中删除了嵌入的xml,没有定义xsi。 – user671534 2011-03-29 09:55:27