Java 在JDOM2中创建属性为xsi:type的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文档

<?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我更新了答案,但忘了通知你