簡體   English   中英

使用Rome Java API訪問元數據字段

[英]Using the Rome Java API to access metadata fields

我一直在使用Rome API來非常成功地解析來自XML提要的數據,但是卻遇到了一些障礙。

給出以下XML片段:

<條目>
<ID> UNIQUEID </ ID>
<更新> 2008-11-05T01:32:35Z </更新>
<mm:status xmlns:mm =“ http://contentprovider.com&quot ; available =”true“/>
<TITLE>標題</ TITLE>
...
...
</條目>

使用SyndEntryImpl類我可以使用它的標准方法(getTitle,getPublishedDate等)來提取標題,id,更新日期等,但還沒有想出獲取元數據標簽的方法(<mm:status .. )。

獲取feed條目的字符串表示將是一個可接受的解決方案,因為我能夠使用字符串函數來檢索信息,但即便如此,我還沒有找到一個簡單的方法。

過去有沒有人參與其中?

謝謝。

以下是我們代碼中的原始類,沒有太多解釋(但現在已經很晚了!)。 這解析了元素:

import com.sun.syndication.io.ModuleGenerator;
import com.sun.syndication.io.impl.DateParser;
import com.sun.syndication.feed.module.Module;

import java.util.Collections;
import java.util.Set;
import java.util.HashSet;

import org.jdom.Element;
import org.jdom.Namespace;

/**
 * Generates mp content in atom.
 */
public class ModuleGenerator implements ModuleGenerator {

    private static final Namespace NAMESPACE = Namespace.getNamespace("mp", Module.URI);
    private static final Set<Namespace> NAMESPACES;

    static {
        Set<Namespace> namespaces = new HashSet<Namespace>();
        namespaces.add(NAMESPACE);
        NAMESPACES = Collections.unmodifiableSet(namespaces);
    }

    public String getNamespaceUri() {
        return Module.URI;
    }

    public Set<Namespace> getNamespaces() {
        return NAMESPACES;
    }

    public void generate(Module module, Element element) {
        Module myModule = (Module) module;
        if (myModule.getStartDate() != null) {
            Element myElement = new Element("startDate", NAMESPACE);
            myElement.setText(DateParser.formatW3CDateTime(myModule.getStartDate()));
            element.addContent(myElement);
        }
        if (myModule.getEndDate() != null) {
            Element myElement = new Element("endDate", NAMESPACE);
            myElement.setText(DateParser.formatW3CDateTime(myModule.getEndDate()));
            element.addContent(myElement);
        }
    }
}

import com.sun.syndication.feed.module.Module;

import java.util.Date;

/**
 * Module for mp atom extension.
 */
public interface Module extends Module {
    public static final String URI = "http://www.mp.com/namespace";

    public Date getStartDate();
    public void setStartDate(Date date);

    public Date getEndDate();
    public void setEndDate(Date date);
}

public class ModuleImpl extends ModuleImpl implements Module {

    private Date startDate;
    private Date endDate;

    public ModuleImpl() {
        super(Module.class, Module.URI);
    }

    @Override
    public Class getInterface() {
        return Module.class;
    }

    @Override
    public void copyFrom(Object obj) {
        Module module = (Module) obj;
        setStartDate(module.getStartDate());
        setEndDate(module.getEndDate());
    }

    @Override
    public Date getStartDate() {
        return startDate;
    }

    @Override
    public void setStartDate(Date date) {
        startDate = date;
    }

    @Override
    public Date getEndDate() {
        return endDate;
    }

    @Override
    public void setEndDate(Date date) {
        endDate = date;
    }

    @Override
    public String toString() {
        return "ModuleImpl{" +
                "startDate=" + startDate +
                ", endDate=" + endDate +
                '}';
    }
}

package com.mp.core.iomanagement.contentanalyzers.modules;

import java.util.Date;

import org.jdom.Element;
import org.jdom.Namespace;

import com.sun.syndication.feed.module.Module;
import com.sun.syndication.io.ModuleParser;
import com.sun.syndication.io.impl.DateParser;

/**
 * Parses mp content from atom.
 */
public class ModuleParser implements ModuleParser {

    public String getNamespaceUri() {
        return Module.URI;
    }

    public Module parse(Element element) {
        Namespace myNamespace = Namespace.getNamespace(Module.URI);
        Module module = null;
        Date start = null;
        Date end = null;
        final Element startChild = element.getChild("startDate", myNamespace);
        if (startChild!=null) {
            start = DateParser.parseDate(startChild.getText());
        }
        final Element endChild = element.getChild("endDate", myNamespace);
        if (endChild!=null) {
            end = DateParser.parseDate(endChild.getText());
        }

        if (start!=null || end!=null) {
            module = new ModuleImpl();
            module.setStartDate(start);
            module.setEndDate(end);
        }
        return module;
    }
}

rome.properties:

atom_1.0.item.ModuleParser.classes=\
com.mp.core.iomanagement.contentanalyzers.modules.ModuleParser

atom_1.0.item.ModuleGenerator.classes=\
com.mp.core.iomanagement.contentanalyzers.modules.ModuleGenerator

我只是無法使模塊方法工作。 只是模塊對象不在那里。 在飼料或入門級別。 幸運的是,方法提要/輸入.getForeignMarkup()確實對我有用。

如果您還沒有使用它, v1.0RC1有幾個解析修復程序。 也許嘗試升級?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM