在Java DOM中创建以名称空间为前缀的XML节点

大扎

我正在通过Java创建多个XML文件,到目前为止一切正常,但是现在尝试创建带有名称空间前缀节点的文件时遇到了问题,例如,<tns:node> ... </tns:node>使用已经重构的代码版本适用于没有名称空间的普通xml文件。

被抛出的错误是:

org.w3c.dom.DOMException: INVALID_CHARACTER_ERR: Ungültiges XML-Zeichen angegeben. 

抱歉,德国人说“指定了无效的XML符号”。

发生错误的代码行:

Element mainRootElement = doc.createElement("tns:cmds xmlns:tns=\"http://abc.de/x/y/z\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://abc.de/x/y/z xyzschema.xsd\"");

为了消除错误导致转义较长的字符串或这些行中的某些内容的可能性,我也尝试仅使用Element mainRootElement = doc.createElement("tns:cmds");,但这会导致相同的错误。

这就是为什么我认为它与名称空间声明(即:用来完成此操作)有关,因为这是我在该字符串中想到的唯一“无效”字符。

谁能确认这是问题的根源?如果是这样,是否有一个简单的解决方案?Java DOM可以完全使用命名空间标记吗?

编辑:整个方法供参考

private void generateScriptXML()
    {
        DocumentBuilderFactory icFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder icBuilder;
        try
        {
            icBuilder = icFactory.newDocumentBuilder();
            Document doc = icBuilder.newDocument();

            Element mainRootElement = doc.createElement("tns:cmds xmlns:tns=\"http://abc.de/x/y/z\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://abc.de/x/y/z xyzschema.xsd\"");

            doc.appendChild(mainRootElement);
            mainRootElement.appendChild(getAttributes(doc,"xxx", "yyy", "zzz"));
            mainRootElement.appendChild(getAttributes(doc,"aaa", "bbb", "ccc"));
            mainRootElement.appendChild(getAttributes(doc,"ddd", "eee", "fff"));
            ...
            ...

            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            DOMSource source = new DOMSource(doc);
            StreamResult streamResult = new StreamResult(new File(vfsPath));
            transformer.transform(source, streamResult);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
W

方法错误,请尝试* NS变体:

Element mainRootElement = doc.createElementNS(
   "http://abc.de/x/y/z", // namespace
   "tns:cmds" // node name including prefix
);

第一个参数是名称空间,第二个是节点名称,包括前缀/别名。如果需要,将自动为名称空间添加名称空间定义。它也可以将它们设置为属性。

原始来源中的名称空间为http://abc.de/x/y/z通过该属性xmlns:tns="http://abc.de/x/y/z"tns为名称空间定义了别名/前缀DOM API将为使用* NS方法创建的节点隐式添加名称空间。

xmlns并且xml是特定名称空间的保留/默认名称空间前缀。xmlns(名称空间定义)的名称空间为http://www.w3.org/2000/xmlns/

要使用setAttributeNS()添加xmlns:*属性,请使用xmlns命名空间:

mainRootElement.setAttributeNS(
  "http://www.w3.org/2000/xmlns/", // namespace
  "xmlns:xsi", // node name including prefix
  "http://www.w3.org/2001/XMLSchema-instance" // value
);

但这甚至是不需要的。就像元素一样,如果使用名称空间定义添加属性节点,则将隐式添加名称空间定义。

mainRootElement.setAttributeNS(
  "http://www.w3.org/2001/XMLSchema-instance", // namespace
  "xsi:schemaLocation", // node name including prefix
  "http://abc.de/x/y/z xyzschema.xsd" // value
);

命名空间前缀

如果看到类似的节点名xsi:schemaLocation,则可以通过查找xmlns:xsi属性来解决此属性是namepace定义。该值是实际的名称空间。因此,如果您具有属性,xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"则可以将节点名称解析为{http://www.w3.org/2001/XMLSchema-instance}schemaLocation(Clark表示法)。

如果要创建节点,则需要3个值:

  1. 命名空间: http://www.w3.org/2001/XMLSchema-instance
  2. 本地节点名称: schemaLocation
  3. 前缀: xsi

该前缀对于元素节点是可选的,但对于属性节点是必需的。以下三个XML将所有解析为元素节点名称{http://abc.de/x/y/z}cmds

  • <tns:cmds xmlns:tns="http://abc.de/x/y/z"/>
  • <cmds xmlns="http://abc.de/x/y/z"/>
  • <other:cmds xmlns:other="http://abc.de/x/y/z"/>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Java DOM XML构建器中添加名称空间前缀

来自分类Dev

在Java中创建xml时仅在根节点上添加名称空间

来自分类Dev

在Java中获取具有名称空间的XML节点

来自分类Dev

Java DOM:如何添加具有特定前缀的名称空间?

来自分类Dev

如何在JAVA中编码默认名称空间和带有单个XML元素前缀的名称空间

来自分类Dev

如何在JAVA中编码默认名称空间和带有单个XML元素前缀的名称空间

来自分类Dev

如何使用Java DOM创建XML节点?

来自分类Dev

IBM JAVA 节点更改默认名称空间前缀 (NS1)

来自分类Dev

如何使用dom解析器重命名Java中xml节点中的属性名称

来自分类Dev

使用Java和xPath在OWL / XML文件中提取节点后,命名空间前缀未声明错误

来自分类Dev

从XML文件中删除节点(DOM4J,JAVA)

来自分类Dev

XML:子节点是否继承父节点的名称空间前缀?

来自分类Dev

在 java 中为 mongodb 创建地理空间查询

来自分类Dev

java copy-of xsl转换删除名称空间前缀

来自分类Dev

在Java中为单链接列表创建新节点

来自分类Dev

如何控制XML中的名称空间前缀?

来自分类Dev

使用Java解析xml DOM子节点

来自分类Dev

xpath包含Java中的名称空间的问题(Dom解析器)

来自分类Dev

wsimport生成的Java中缺少名称空间

来自分类Dev

如何在 Java 中读取 XML DOM 对象中的特定节点?

来自分类Dev

XML名称空间前缀错误

来自分类Dev

Java DOM appendChild:名称空间和签名的文档

来自分类Dev

如何在不考虑Java中命名空间名称的情况下从XML获取Node?

来自分类Dev

如何在Java X路径中获取带有名称空间的嵌套xml的属性

来自分类Dev

Java中DOM遍历的firstChild节点问题

来自分类Dev

在Java Jung中添加节点名称

来自分类Dev

Java类名称空间?

来自分类Dev

使用Unmarshal在Go中获取XML名称空间前缀

来自分类Dev

在xml消息中插入几个带前缀的名称空间

Related 相关文章

  1. 1

    如何在Java DOM XML构建器中添加名称空间前缀

  2. 2

    在Java中创建xml时仅在根节点上添加名称空间

  3. 3

    在Java中获取具有名称空间的XML节点

  4. 4

    Java DOM:如何添加具有特定前缀的名称空间?

  5. 5

    如何在JAVA中编码默认名称空间和带有单个XML元素前缀的名称空间

  6. 6

    如何在JAVA中编码默认名称空间和带有单个XML元素前缀的名称空间

  7. 7

    如何使用Java DOM创建XML节点?

  8. 8

    IBM JAVA 节点更改默认名称空间前缀 (NS1)

  9. 9

    如何使用dom解析器重命名Java中xml节点中的属性名称

  10. 10

    使用Java和xPath在OWL / XML文件中提取节点后,命名空间前缀未声明错误

  11. 11

    从XML文件中删除节点(DOM4J,JAVA)

  12. 12

    XML:子节点是否继承父节点的名称空间前缀?

  13. 13

    在 java 中为 mongodb 创建地理空间查询

  14. 14

    java copy-of xsl转换删除名称空间前缀

  15. 15

    在Java中为单链接列表创建新节点

  16. 16

    如何控制XML中的名称空间前缀?

  17. 17

    使用Java解析xml DOM子节点

  18. 18

    xpath包含Java中的名称空间的问题(Dom解析器)

  19. 19

    wsimport生成的Java中缺少名称空间

  20. 20

    如何在 Java 中读取 XML DOM 对象中的特定节点?

  21. 21

    XML名称空间前缀错误

  22. 22

    Java DOM appendChild:名称空间和签名的文档

  23. 23

    如何在不考虑Java中命名空间名称的情况下从XML获取Node?

  24. 24

    如何在Java X路径中获取带有名称空间的嵌套xml的属性

  25. 25

    Java中DOM遍历的firstChild节点问题

  26. 26

    在Java Jung中添加节点名称

  27. 27

    Java类名称空间?

  28. 28

    使用Unmarshal在Go中获取XML名称空间前缀

  29. 29

    在xml消息中插入几个带前缀的名称空间

热门标签

归档