java - 如何将 namespace 声明添加到DOM的根元素?

原文 标签 java xml dom xml-namespaces

我需要(嗯,真的很想...)将名称空间声明添加到DOM树的根元素。
我稍后在文档中重复使用该名称空间,并且在使用它的每个节点中都有该声明不是很方便:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><test>
   <value xmlns:test="urn:mynamespace" test:id="1">42.42</value>
   <value2 xmlns:test="urn:mynamespace" test:id="2">Hello Namespace!</value2>
</test>


我想要得到的是

<?xml version="1.0" encoding="UTF-8" standalone="no"?><test xmlns:test="urn:mynamespace">
   <value test:id="1">42.42</value>
   <value2 test:id="2">Hello Namespace!</value2>
</test>


这在以后手动编辑时更加方便。

我知道这是可能的,因为这是我在加载包含以下内容的文档时所得到的

<test xmlns:test="urn:mynamespace">
</test>


并添加其余节点。

所以我认为问题可以归结为:
如何将xmlns:test =“ urn:mynamespace”添加到根节点?当我尝试添加属性时,出现NAMESPACE_ERR异常(我使用了支持名称空间的工厂,等等)。因为我试图绕过我找不到的API来处理名称空间...

注意:在根元素中没有使用命名空间的属性(当我允许时,我就可以使用它),而只有命名空间声明。

最佳答案

使用此XSLT文档

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:test="urn:mynamespace">

<xsl:output indent="yes" standalone="no" encoding="UTF-8"/>

<!-- Copies root element and its contents -->
<xsl:template match="/*" priority="2">
    <xsl:element name="{name()}" namespace="{namespace-uri()}">
        <xsl:copy-of select="namespace::*"/>
        <xsl:copy-of select="document('')/*/namespace::*[name()='test']"/>
        <xsl:copy-of select="@*"/>
        <xsl:copy-of select="*"/>
    </xsl:element>
</xsl:template>

<!-- Copies comments, processing instructions etc. outside
     the root element. This is not neccesarily needed. -->
<xsl:template match="/node()">
    <xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>


给定此输入(您的代码示例)

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<test>
   <value xmlns:test="urn:mynamespace" test:id="1">42.42</value>
   <value2 xmlns:test="urn:mynamespace" test:id="2">Hello Namespace!</value2>
</test>


产生所需的输出

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<test xmlns:test="urn:mynamespace">
  <value test:id="1">42.42</value>
  <value2 test:id="2">Hello Namespace!</value2>
</test>


您可以使用Transformer类在Java中执行XSLT转换。

javax.xml.transform.Source xsltSource = new javax.xml.transform.stream.StreamSource(xsltFile);
Transformer transformer = TransformerFactory.newInstance().newTransformer(xsltSource);


其中,xsltFile是指向该XSLT文件的File对象。

关于java - 如何将 namespace 声明添加到DOM的根元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22482350/

相关文章:

java - Java Http请求仅返回我想要的某些元素

javascript - document.querySelectorAll在运行chrome 80的cypress中不起作用

java - Apache Flink:Wierd FlatMap行为

java - 如果外部jar中存在该方法,该如何在Java中模拟该方法?

php - 创建 xml 文件

jquery - 通过索引jQuery查找子项

java - 使用Guice和JMockit进行单元测试拦截器

c# - 集合作为装饰器:伪代码实现建议

java - XSL XML到CSV位置编号

java - Eclipse XML编辑器显示android1不是android并且没有自动完成