Java 在JDOM2中创建属性为xsi:type的XML节点
我正在尝试创建下面的XML文档Java 在JDOM2中创建属性为xsi:type的XML节点,java,xml,jdom-2,Java,Xml,Jdom 2,我正在尝试创建下面的XML文档 <?xml version="1.0" encoding="UTF-8"?> <BCPFORMAT> <RECORD> <FIELD ID="1" xsi:type="CharFixed" MAX_LENGTH="4" /> </RECORD> </BCPFORMAT> 但我得到了以下错误: 名称“xsi:type”对于JDOM/XML属性不合法:XML名称“xsi:type
<?xml version="1.0" encoding="UTF-8"?>
<BCPFORMAT>
<RECORD>
<FIELD ID="1" xsi:type="CharFixed" MAX_LENGTH="4" />
</RECORD>
</BCPFORMAT>
但我得到了以下错误:
名称“xsi:type”对于JDOM/XML属性不合法:XML名称“xsi:type”不能包含字符“:”
我知道我可能需要使用名称空间,但我不知道如何使用。JDOM不允许您以这种方式创建包含冒号(
:
)的路径,因为:
上的XML 1.0规范保留给名称空间
要设置或创建使用命名空间的属性,必须使用接受命名空间作为参数的函数/构造函数
在这种情况下,您可以使用以下选项:
e.setAttribute("type", "CharFixed", Namespace.getNamespace("xsi", "xsi_uri"));
<?xml version="1.0" encoding="UTF-8"?>
<BCPFORMAT xmlns:xsi="xsi_uri">
<RECORD>
<FIELD ID="1" xsi:type="CharFixed" MAX_LENGTH="4" />
</RECORD>
</BCPFORMAT>
更新:
我们可以在子项(字段)的父项之一中添加名称空间声明,并将子项设置为对给定属性使用此名称空间
Namespace namespace = Namespace.getNamespace("xsi", "xsi_uri");
root.addNamespaceDeclaration(namespace);
// ...
Element name = new Element("FIELD")
.setAttribute("ID", "1")
.setAttribute("type", "CharFixed", root.getNamespacesInScope().get(2))
.setAttribute("MAX_LENGTH", "4");
// ...
输出将如下所示:
e.setAttribute("type", "CharFixed", Namespace.getNamespace("xsi", "xsi_uri"));
<?xml version="1.0" encoding="UTF-8"?>
<BCPFORMAT xmlns:xsi="xsi_uri">
<RECORD>
<FIELD ID="1" xsi:type="CharFixed" MAX_LENGTH="4" />
</RECORD>
</BCPFORMAT>
因此,索引0是一个空名称空间,索引1是默认的XML名称空间,最后,索引2是为xsi添加的名称空间
当然,我们不想硬编码所需名称空间的索引,因此,我们可以执行以下操作来预先缓存所需名称空间:
Namespace xsiNamespace =
root.getNamespacesInScope().stream() // Streams the namespaces in scope
.filter((ns)->ns.getPrefix().equals("xsi")) // Search for a namespace with the xsi prefix
.findFirst() // Stops at the first find
.orElse(namespace); // If nothing was found, returns
// the previously declared 'namespace' object instead.
使用缓存的命名空间:
// ...
.setAttribute("type", "CharFixed", xsiNamespace)
// ...
输出如下:我们可以删除xmlns:xsi=“xsi_uri”吗????它应该是:@SumantraChakraborty我更新了答案,但忘了通知你