当前位置: 首页 > 知识库问答 >
问题:

XML编组:我想要名称空间属性而不是前缀

宰父桐
2023-03-14

我有一个非常复杂的XML树,它在架构中有几个命名空间。我设法生成了相应的Jaxb(使用eclipse IDE),marshaller/unmarshaller工作正常。

现在,我需要将XML转换为特定格式,因为我需要将其提供给某个系统,并且我没有其他选择。

生成的XML是:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <ns2:data xmlns:ns2="ns:example-main" xmlns:ns10="ns:example-main/mynamespace10"        xmlns:ns11="http://www.w3.org/1999/XSL/Transform"  xmlns:ns4="ns:example-main/mynamespace5" xmlns:ns5="ns:example-main/mynamespace6" xmlns:ns6="ns:example-main/mynamespace111" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:example-main resource:example-main">
<ns6:ruleList>
<ns6:rule>
<ns6:name>DFAC</ns6:name>
<ns6:className>com.example.Rule</ns6:className>
<ns6:label>DFAC class</ns6:label>
</ns6:rule>
</ns6:ruleList>
</ns2:data>

我需要生成的XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data xmlns="ns:example-main" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:example-main resource:example-main">
<ruleList xmlns="ns:example-main/Rule" xsi:schemaLocation="ns:example-main/Rule resource:Rule">
<rule>
<name>DFAC</name>
<className>com.example.Rule</className>
<label>DFAC class</label>
</rule>
</ruleList>
</data>

我正在使用Jaxb RI 2.2.6 到目前为止我所做的工作:1。

myjaxbMarshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespaceMapper());

并从方法返回“”

>

  • @使用xmlns的XmlSchema注释

    @XmlSchema(namespace="example-main",xmlns={@javax.xml.bind.annotation.XmlNs(namespaceURI="ns: example e-main", prefix="")

    写入DOM树并使用DOM的命名空间配置,然后Marsahling DOM:

    doc.getDomConfig()。setParameter(“名称空间”,true);doc.getDomConfig()。setParameter(“命名空间声明”,true);doc.normalizeDocument();

    或者在上面的行中将名称空间设置为false,以完全消除名称空间,但这也没有帮助

  • 共有1个答案

    皇甫夕
    2023-03-14

    您可以尝试使用NamespacePrefix Mapper。您必须扩展它并将其设置为属性。

    以下是最短方法的示例:

    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", 
                                                  new NamespacePrefixMapper() {
    
                @Override
                public String[] getPreDeclaredNamespaceUris() {
                    return new String[] { MyNamespaces.EXAMPLE_MAIN };
                }
    
                @Override
                public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
                    if (namespaceUri.equals(MyNamespaces.EXAMPLE_MAIN) ||
                        namespaceUri.equals(MyNamespaces.EXAMPLE_MAIN_RULE))
    
                        return "";
    
                }
            }); 
    
     类似资料:
    • 通过使用JavaScript,是否有一种方法可以知道特定属性来自哪个名称空间? 我似乎找不到任何与这个问题相关的东西... 示例: 具有class属性的DIV元素。类来自哪个命名空间? 具有viewBox属性的SVG元素。viewBox来自哪个命名空间? 编辑: 如果希望在USE元素上设置“xlink:href”属性,则必须指定名称空间“http://www.w3.org/1999/xlink”。

    • 问题内容: 我正在用lxml生成一些XML,并像这样生成节点: 和: 这些自定义属性正在杀死Quickbooks的解析器。我可以不使用自定义内容来渲染LXML吗? 问题答案: 看起来像下面这样照顾它: 或者,如果使用lxml> = 2.3.2(感谢@Pedru):

    • 本文向大家介绍xpath 示例XML(无名称空间),包括了xpath 示例XML(无名称空间)的使用技巧和注意事项,需要的朋友参考一下 示例 这是一些示例XML,可以针对这些XML编写示例XPath:            

    • 我是XML新手。这是一个家庭作业。我已经尽了最大努力,但我无法让实例文档进行验证。我总是犯错误 “找不到元素'站点'的声明。 我想我可能错误地声明了一些名称空间或者schemaLocations。有人能给我指一下正确的方向吗? 作业步骤: > <块引用> 在sites.xml文件中,向根站点元素添加命名空间声明,将xs前缀与XML Schema命名空间的URI相关联。为文件指定默认命名空间http

    • 问题内容: 我得到了以下XML: 跟随XPath不起作用意味着没有任何打印内容,例如“ data”元素不存在: /root/items/item/details/data 但是,当我删除“数据”元素的“ xmlns”名称空间属性时,将打印其内容。在不删除“数据”元素的“ xmlns”命名空间属性的情况下,xpath表达式应该如何工作? 我正在使用SAXON和XSL 1.0。 问题答案: 这是XPa

    • 问题内容: 什么是PHP命名空间? 一般而言,命名空间是什么? 一个有例子的Layman答案会很棒。 问题答案: Namespacing对函数和类起作用,而作用域对变量起作用。它允许您在同一程序的不同部分中使用相同的函数或类名称,而不会引起名称冲突。 简单来说, 将名称空间视为一个人的姓氏 。如果有两个人名为“ John”,则可以使用他们的姓氏来区分他们。 场景 假设您编写了一个使用名为的函数的应