1

以下のxmlファイルがあります。

    <?xml version="1.0" encoding="UTF-8"?>
<!--

    This is a sample netbeans project file for a Squawk project.
    You may edit it freely, it doesn't affect the ant-powered build.

 -->
<project xmlns="http://www.netbeans.org/ns/project/1">
    <type>org.netbeans.modules.ant.freeform</type>
    <configuration>
        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
            <properties>
                <property-file>${user.home}/.sunspot.properties</property-file>
                <property-file>build.properties</property-file>
                <property-file>${sunspot.home}/default.properties</property-file>
            </properties>
            <name>${application.title}</name>
            <folders>
                <source-folder>
                    <label>src</label>
                    <type>java</type>
                    <location>src</location>
                </source-folder>
            </folders>
            <ide-actions>
                <action name="build">
                    <target>jar-app</target>
                </action>
                <action name="run">
                    <target>deploy</target>
                    <target>run</target>
                </action>
                <action name="clean">
                    <target>clean</target>
                </action>
                <action name="rebuild">
                    <target>clean</target>
                    <target>jar-app</target>
                </action>
                <action name="javadoc">
                    <target>javadoc</target>
                </action>
            </ide-actions>
            <export>
                <type>folder</type>
                <location>build</location>
                <build-target>jar-app</build-target>
            </export>
            <view>
                <items>
                    <source-folder style="packages">
                        <label>src</label>
                        <location>src</location>
                    </source-folder>
                    <source-file>
                        <location>build.xml</location>
                    </source-file>
                </items>
                <context-menu>
                    <ide-action name="build"/>
                    <ide-action name="rebuild"/>
                    <ide-action name="clean"/>
                    <ide-action name="javadoc"/>
                    <ide-action name="run"/>
                    <action>
                        <label>Build Project + Deploy to Sun SPOT</label>
                        <target>deploy</target>
                    </action>
                    <action>
                        <label>Deploy to Sun SPOT</label>
                        <target>jar-deploy</target>
                    </action>
                    <separator/>
                </context-menu>
            </view>
            <subprojects/>
        </general-data>
        <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/1">
            <compilation-unit>
                <package-root>src</package-root>
                <classpath mode="boot">${sunspot.bootclasspath}</classpath>
                <classpath mode="compile">${sunspot.classpath}</classpath>
                <built-to>build</built-to>
                <source-level>1.4</source-level>
            </compilation-unit>
        </java-data>
        <preferences xmlns="http://www.netbeans.org/ns/auxiliary-configuration-preferences/1">
            <module name="org-netbeans-modules-editor-indent">
                <node name="CodeStyle">
                    <property name="usedProfile" value="default"/>
                    <node name="project">
                        <property name="tab-size" value="8"/>
                        <property name="text-limit-width" value="80"/>
                    </node>
                </node>
                <node name="text">
                    <node name="x-java">
                        <node name="CodeStyle">
                            <node name="project"/>
                        </node>
                    </node>
                </node>
            </module>
        </preferences>
    </configuration>
</project>

一部のプロパティとノードの値を変更し、ファイルでデシリアライズするために、Java と Xstream ライブラリ (シリアル化) で解析したいのですが、これらすべてを処理する Java クラスを作成するのは難しく、あまり便利ではありません。ノード (ノードごとに Java クラスを作成する必要があります。例: 1 つのクラスに 1 つのクラス、次に 1 つのクラスに 1 つのクラスなど)。少し時間の無駄であることがわかりました。それとも、ライブラリの動作方法に何か問題があることを理解しましたか? ありがとう

4

2 に答える 2

0

あなたが XStream にどの程度結びついているかはわかりませんが、MOXy JAXBはあなたが探しているタイプのマッピングを提供します。以下は、オブジェクトのマッピング方法の部分的なサンプルです。

package-info.java (パッケージ レベルの注釈を設定するため)

ここで割り当てられた名前空間プレフィックスは後で使用されます。

@XmlSchema( 
    namespace = "http://www.netbeans.org/ns/project/1", 
    xmlns = {
            @javax.xml.bind.annotation.XmlNs(prefix = "f", namespaceURI = "http://www.netbeans.org/ns/freeform-project/1"),
        },
    elementFormDefault = XmlNsForm.QUALIFIED)
@XmlAccessorType(XmlAccessType.FIELD)
package example; 

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

Project.java

@XmlPath を使用して、クラスとノード間の 1 対 1 の依存関係を解消していることに注意してください。

package example;

import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlType(propOrder={"type", "propertyFile", "name"})
public class Project {

    private String type;

    @XmlPath("configuration/f:general-data/f:properties/f:property-file/text()")
    private List<String> propertyFile;

    @XmlPath("configuration/f:general-data/f:name/text()")
    private String name;

    @XmlPath("configuration/f:general-data/f:folders/f:source-folder")
    private List<Folder> sourceFolder;

    @XmlPath("configuration/f:general-data/f:ide-actions/f:action")
    private List<Action> action;

}

フォルダ.java

package example;

import javax.xml.bind.annotation.XmlType;

@XmlType(namespace="http://www.netbeans.org/ns/freeform-project/1")
public class Folder {

    private String label;
    private String type;
    private String location;

}

アクション.java

package example;

import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;

@XmlType(namespace="http://www.netbeans.org/ns/freeform-project/1")
public class Action {

    @XmlAttribute
    private String name;

    private List<String> target;
}

デモ.java

package example;

import java.io.FileInputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Project.class);

        FileInputStream xml = new FileInputStream("src/forum32/input.xml");
        Project project = (Project) jc.createUnmarshaller().unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(project, System.out);
    }
}

MOXy JAXB を使用するには、次のエントリを使用してモデル クラスに jaxb.properties ファイルを追加する必要があります。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
于 2010-08-04T18:42:20.613 に答える
0

シリアル化に使用される XML を制御する場合 (または XML スキーマが既に定義されている場合) は、コンバーター クラスを実装できます。ただし、デフォルトのコーディングをそのまま使用する (または少しだけ変更する) と、XStream を使用するのが最も簡単になります。次に、コーディングはほとんど必要ありませんが、生成される XML を受け入れる必要があります。

于 2010-08-04T10:07:06.340 に答える