如何使用JAXB抑制XSI

时间:2012-04-25 09:12:55

标签: xml jaxb

JAXB2的默认XML输出如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TEST2 xmlns="http://projects/open/2012/UniformProxySystem">
    <XXX1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <XXX2>17:02:26</XXX2>
    <XXX3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</TEST2>

但我希望如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TEST2 xmlns="http://projects/open/2012/UniformProxySystem" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <XXX1 xsi:nil="true"/>
    <XXX2>17:01:08</XXX2>
    <XXX3 xsi:nil="true"/>
</TEST2>

寻找帮助,我正在使用JDK6和JAXB 2.1

5 个答案:

答案 0 :(得分:1)

您可以尝试使用@XmlSchema注释并执行以下操作:

<强> package-info.java

@XmlSchema(
    elementFormDefault=XmlNsForm.QUALIFIED,
    namespace="http://projects/open/2012/UniformProxySystem",
    xmlns={@XmlNs(prefix="xsi",
                  namespaceURI="http://www.w3.org/2001/XMLSchema-instance")}
)
package com.example;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

答案 1 :(得分:1)

这有效!

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://projects/open/2012/UniformProxySystem", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
    ,
            xmlns={@XmlNs(prefix="xsi",
            namespaceURI="http://www.w3.org/2001/XMLSchema-instance"),
            @XmlNs(prefix="",
            namespaceURI="http://projects/open/2012/UniformProxySystem")}
)

答案 2 :(得分:0)

您也可以参考answer here获取替代解决方案,特别是如果您的程序中已经有前缀命名空间映射器(如果从XSD生成JAXB类,则也很有用)。

答案 3 :(得分:0)

我将SCHEMA_LOCATION属性添加到marsheller,这有效,但生成另一个attr xsi:schemaLocation =“...”,所以我在生成的Docuemnt对象中手动删除了这个attr。

答案 4 :(得分:0)

在java中,你可以使用

Sitecore.Data.Fields.MultilistField treelistField = Sitecore.Context.Item.Fields["myTreelistFieldName"]; 
Item [] selectedItems = treelistField.GetItems();

foreach (Item item in selectedItems)
{
    string itemName = item.Name;
    string displayName = item.DisplayName; // fallback to Name if not set
    string title = item["Title"]; // assuming there is a field called Title
    string url = LinkManager.GetItemUrl(item);
}