jsonix - 如何创建一个有前缀但没有命名空间的元素?

Posted

技术标签:

【中文标题】jsonix - 如何创建一个有前缀但没有命名空间的元素?【英文标题】:jsonix - How to create an element with prefix and without namespace? 【发布时间】:2017-07-06 12:08:51 【问题描述】:

我需要发送包含以下元素的 XML:

<return>
    <getrooms>true</getrooms>
    <filters xmlns:a="http://some.com/xsd/atomicCondition" xmlns:c="http://some.com/xsd/complexCondition">
        <city></city>
        <country></country>
        <c:condition>
            <a:condition>
                <fieldname>fieldName</fieldname>
                <fieldtest>fieldTest</fieldtest>
                <fieldvalues>
                    <fieldvalue>fieldValue</fieldvalue>
                </fieldvalues>
            </a:condition>
            <operator>operator</operator>
            <a:condition>
                <fieldname>fieldName</fieldname>
                <fieldtest>fieldTest</fieldtest>
                <fieldvalues>
                    <fieldvalue>fieldValue</fieldvalue>
                 </fieldvalues>
            </a:condition>
         </c:condition>
    </filters>
    <resultsperpage></resultsperpage>
    <page></page>
</return>

我在使用 Jsonix 形成“c:condition”和“a:condition”Qname 时遇到了困难。两个 Qname 都包含前缀但没有命名空间。

我当前的代码是:


    type: 'element',
    name: 'ccondition',
    elementName: 
        localPart: 'condition',
        prefix: 'c',
        namespaceURI: 'c'
    ,
    typeInfo: 'DOXML.ComplexCondition'
,

这将导致以下结果:

&lt;c:condition xmlns:c="c"&gt;

任何人都知道如何使用 Jsonix 来生成所需的 Qname - “c:condition” 没有命名空间URI?

【问题讨论】:

【参考方案1】:

在您的示例中,前缀 c 实际上绑定到此行中的命名空间 http://some.com/xsd/complexCondition

<filters xmlns:a="http://some.com/xsd/atomicCondition" xmlns:c="http://some.com/xsd/complexCondition">

ac 两个前缀都绑定到 filters 元素范围内的非空命名空间。

所以你实际上应该这样做:

type: 'element', name: 'ccondition', elementName: localPart: 'condition', prefix: 'c', namespaceURI: 'http://some.com/xsd/complexCondition' , typeInfo: 'DOXML.ComplexCondition'

我认为您应该能够使用 namespaceURI: '' 映射到空命名空间,但如果我没看错的话,这不是您所需要的。

【讨论】:

嗨词典!是的,它仍然以&lt;c:condition xmlns:c= " "&gt; 结尾,仍然与上面提供的 XML 格式不匹配。预期是&lt;c:condition&gt; 您似乎忽略了我的回答部分,我说您实际上在这里有xmlns:c="http://some.com/xsd/complexCondition"。因此,您应该使用namespaceURI: 'http://some.com/xsd/complexCondition' 嗨@lexicore 我不明白你的意思是使用namespaceURI: 'http://some.com/xsd/complexCondition',然后用namespaceURI: '' 映射它。按照下面的 type: 'element', name: 'ccondition', elementName: localPart: 'condition', prefix: 'c', namespaceURI: 'http://some.com/xsd/complexCondition' , typeInfo: 'DOXML.ComplexCondition' ,结果将是&lt;c:condition xmlns:c= "http://some.com/xsd/complexCondition "&gt; 使用上下文将namespaceURI添加到&lt;filters&gt;,Jsonix仍然不允许namespaceURI='' 然后用它映射 我从来没有说过“然后”。我说你应该可以使用空命名空间(namespaceURI: ''),但这不是你想要的。

以上是关于jsonix - 如何创建一个有前缀但没有命名空间的元素?的主要内容,如果未能解决你的问题,请参考以下文章

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

添加带有前缀的开始元素,没有命名空间

如何将 XPath 与没有前缀的默认命名空间一起使用?

XSLT 将命名空间前缀添加到元素最佳实践

在 JAXB 编组时删除命名空间前缀

如何使用 lxml 在属性值中设置命名空间前缀?