【问题标题】:How to remove namespace prefix from xml using Xstream?如何使用 Xstream 从 xml 中删除命名空间前缀?
【发布时间】:2014-04-07 12:28:57
【问题描述】:

我有不同的xml文件,有不同的命名空间eg - oa, ns2, p...etc

我希望在将 xml 转换回 java 对象时忽略命名空间。 或者我希望在将 xml 转换为对象时从 xml 中删除命名空间。

我的示例 xml 数据是

<oa:ApplicationArea>
    <oa:Sender>
        <oa:LogicalId>Volvo</oa:LogicalId>
        <oa:Component>DVLA</oa:Component>
        <oa:Task>ReceiveKeeper</oa:Task>
        <oa:MessageCode>MS1</oa:MessageCode>
        <oa:AuthorizationId>SKARUPAI</oa:AuthorizationId>
        <oa:OrganisationLevel>50</oa:OrganisationLevel>
    </oa:Sender>
    <oa:CreationDateTime>2013-08-31T12:00:00</oa:CreationDateTime>
    <oa:BODId>123456789</oa:BODId>
</oa:ApplicationArea>
<p:DataArea>
    <oa:Sync confirm="Always">
        <oa:SyncCriteria expressionLanguage="XPath">
            <oa:SyncExpression action="Add"></oa:SyncExpression>
        </oa:SyncCriteria>
    </oa:Sync>
    </p:DataArea>

以下是我使用 Xstream 将上述 xml 转换为 java 的代码示例。

public static void main(String[] args) throws Exception {
    FileReader fileReader = new FileReader("C:/kspace/xstream/src/input.out.xml");  // load our xml file
    XStream xstream = new XStream();     // init XStream
    // Determine type of message(Eg. 'EM1') and put the corresponding value from hashmap to a String.
    // Pass the string to xstream.alias(stringnamewhichwasset, xmlRoot.class)

    String interfaceMessageId = "MS1";
    String xmlRootTagName = (String) messages.get(interfaceMessageId);

    xstream.registerConverter(new XMLDateConverter());
    xstream.alias(xmlRootTagName, RootType.class);
    xstream.aliasField("ApplicationArea", RootType.class, "applicationArea");
    xstream.aliasField("DataArea", RootType.class, "dataArea");

    xstream.alias("ApplicationArea", ApplicationArea.class);
    xstream.aliasField("Sender", ApplicationArea.class, "sender");
    xstream.aliasField("CreationDateTime", ApplicationArea.class, "creationDateTime");
    xstream.aliasField("BODId", ApplicationArea.class, "bodId");

    xstream.alias("Sender", Sender.class);
    xstream.aliasField("LogicalId", Sender.class, "logicalId");
    xstream.aliasField("Component", Sender.class, "component");
    xstream.aliasField("Task", Sender.class, "task");
    xstream.aliasField("MessageCode", Sender.class, "messageCode");
    xstream.aliasField("AuthorizationId", Sender.class, "authorizationId");
    xstream.aliasField("OrganisationLevel", Sender.class, "organisationLevel");......
......

有什么办法可以用 Xstream 做到这一点吗?

【问题讨论】:

    标签: java xml namespaces xml-namespaces xstream


    【解决方案1】:

    尝试使用 StaxDriver 后终于得到了解决方案。 这就是我所做的。

    QNameMap qmap = new QNameMap();
    qmap.setDefaultNamespace("http://www.somename.com/xyz");
    qmap.setDefaultPrefix("");
    StaxDriver staxDriver = new StaxDriver(qmap); 
    XStream xstream = new XStream(staxDriver);
    

    像这样创建 xstream 对象将在解析时忽略命名空间前缀。 到目前为止,我已经成功地移除了所有的命名空间前缀。

    【讨论】:

    • 你的 Xsteam 对象和你正在通过文件阅读器读取的输入文件是怎么连接的?
    • 不错!这对我帮助很大,谢谢。
    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 2011-03-04
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多