在使用SimpleXML序列化对象时,如何省略某些元素?

时间:2014-08-08 06:57:23

标签: java xml simple-framework

这可能是一个基本问题,但我无法找到正确的答案。也许这是SimpleXML的特殊用法。

在SimpleXML(java)中,我想从XML中读取一些对象的属性,然后将Object再次保存到另一个XML而不编写这些属性。

我想从这个XML定义中读出“Question”对象:

<question>
<questionID>0</questionID>
<category>tarih</category>
<difficultyLevel>80</difficultyLevel>
<text>Tarihte gelmiş geçmiş en büyük sınırlara ulaşan imparatorluk, aşağıdakilerden hangisidir?</text>
<alternatives length="4">
    <string>Britanya</string>
    <string>Roma</string>
    <string>Moğol</string>
    <string>Osmanlı</string>
</alternatives>
<answerID>0</answerID>

通过消除“替代”字段将其序列化如下:

<question>
    <questionID>0</questionID>
    <category>tarih</category>
    <difficultyLevel>80</difficultyLevel>
    <text>Tarihte gelmiş geçmiş en büyük sınırlara ulaşan imparatorluk, aşağıdakilerden hangisidir?</text>
    <answerID>0</answerID>
</question>

这可能吗?

编辑:“问题”的java类定义:

public class Question {

    public final static int N_POSSIBLE_ANSWERS=4;

    public final static String[] ALTERNATIVE_CAPTIONS = {"A","B","C","D"};

    // Attributes

    @Element
    public int questionID;
    @Element
    public String category;
    @Element
    public int difficultyLevel;
    @Element
    public String text;
    @ElementArray
    private String[] alternatives;

    @Element(required=false)
    private int answerID = -1;
    // State variables

    private int nAddedAlternatives=0;

    public String[] getAlternatives() {
        return alternatives;           
    }

    public void addAlternative(String alternative){
        if(alternatives == null){
            alternatives = new String[N_POSSIBLE_ANSWERS];
        }
        alternatives[nAddedAlternatives] = alternative;
        nAddedAlternatives++;
    }

    public void clearAlternatives(){
        nAddedAlternatives = 0;
        alternatives = null;
    }


    public String getAlternative(int i){
        //String result = ALTERNATIVE_CAPTIONS[i];
        //result += ": ";
        String result = alternatives[i];
        return result;
    }

    public int getAnswer(){
        return answerID;
    }

    public void setAnswer(int answer){
    answerID = answer;
    }

}

ElementArray被定义为“替代品”是这个问题的兴趣点。

祝你好运, fercis

1 个答案:

答案 0 :(得分:0)

请使用以下方法转换

public static void convert(InputStream inputStream,OutputStream outputStream,List<String> result)  {
    try {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setIgnoringElementContentWhitespace(true);
        DocumentBuilder builder = factory.newDocumentBuilder();

        Document document = builder.parse(inputStream);
        if(inputStream != null)
            inputStream.close();

        NodeList childNodes = document.getChildNodes().item(0).getChildNodes();

        Document writeDoc = builder.newDocument();
        Element rootElement = writeDoc.createElement(document.getChildNodes().item(0).getNodeName());

        for (int i = 0; i < childNodes.getLength(); i++) {
            Node item = childNodes.item(i);
            if(result.contains(item.getNodeName())) {
                System.out.println("Skipped ...");
                continue;
            }
            Node node = item.cloneNode(true);
            writeDoc.adoptNode(node);
            rootElement.appendChild(node);
        }
        writeDoc.appendChild(rootElement);

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(writeDoc);
        transformer.transform(source, new StreamResult(outputStream));

    } catch (Exception e) {
        e.printStackTrace();
    }
}

这是将输入作为InputStream的方法,将在OutPutStream中返回结果,将接受需要过滤的String列表。