2

XML とその解析に関する質問がありました。JDOM を使用して XML ファイルを解析していますが、少し問題があります。

私の XML ファイルのサンプルは次のようになります。

 <IO name="Bus" type="Class">
    <ResourceAttribute name="Bandwidth" type="KiloBitPerSecond" value="50" />
 </IO>

Bus はクラス IO のオブジェクト インスタンスです。オブジェクトは name プロパティと type プロパティを取得しました。さらに、サンプルのように、値が 50 の属性帯域幅とデータ型 KiloBitPerSecond のように、いくつかの属性があります。

したがって、次のようにファイルをループしたい場合:

    for(Element packages : listPackages)
        {
                Map<String, Values> valueMap = new HashMap<String, Values>();
                List<Element> objectInstanceList = packages.getChildren();

                for(Element objects : objectInstanceList) 
                {
                    List<Element> listObjectClasses = objects.getChildren();

                    for(Element classes : listObjectClasses) 
                    {
                    List<Element> listObjectAttributes = classes.getChildren();

                        for(Element objectAttributes : listObjectAttributes)
                        {
                            List<Attribute> listAttributes = objectAttributes.getAttributes();

                            for(Attribute attributes : listAttributes)
                            {

                            String name = attributes.getName();
                            String value = attributes.getValue();
                            AttributeType datatype = attributes.getAttributeType();
                            Values v = new Values(name, datatype, value);
                            valueMap.put(classes.getName(), v);
                            System.out.println(name + ":" + value);
                            }

                        }
                    }
                                        }
                //System.out.println(valueMap);
         }

values はオブジェクト属性を定義するクラスです:

public class Values{
 private String name;
 //private AttributeType datatype;
 private String value;

以上がコードの残りの部分です。それに関連して2つの質問があります。現時点では、最初のものがより優先されます。

  1. object(Attribute.Name = Bandwidth; Attribute.Value = 50) の値を取得するにはどうすればよいですか? 私が得る代わりに

    名前:バスの種類:クラス

    追加の for ループを考えましたが、JDOM クラス属性には getAttributes() というメソッドがありません。

  2. 質問 1 がないと先に進めないので、これは 2 番目の優先事項です。サンプルでわかるように、属性は名前、型、値の 3 つのプロパティを取得します。サンプルのトリプルプットを抽出するにはどうすればよいですか。JDOM は、属性の名前と値の 2 つのプロパティを認識しているようです。

事前に感謝します。うまくいけば、私は自分の自己を表現することができました。

編集: 追加の for ループを追加したため、出力は次のようになります。

name:Bandwidth
type:KiloBitPerSecond
value:50

つまり、name はそのプロパティの名前で、value は name の値です。それを知らなかった。少なくとも質問 1 はより明確になり、2 に取り組むことができますが、新しい情報により 2 がより明確になります。

4

1 に答える 1

1

xml では、 の開始タグはと(または) で囲まれ、 の後にelement要素の名前が続き、の形式のリストが続きます。要素は、インラインまたは終了タグで閉じることができます<>/><attributesname="value"/></[element name]>

再帰を使用して xml を解析することをお勧めします。

これは次のようになります。

@Test
public void parseXmlRec() throws JDOMException, IOException {
    String xml = "<root>"
            + "<Package>"
            + "<IO name=\"Bus\" type=\"Class\">\r\n" + 
            "    <ResourceAttribute name=\"Bandwidth\" type=\"KiloBitPerSecond\" value=\"50\" />\r\n" + 
            " </IO>"
            + "</Package>"
            + "</root>";
    InputStream is = new ByteArrayInputStream(xml.getBytes());
    SAXBuilder sb = new SAXBuilder();
    Document document = sb.build(is);
    is.close();

    Element root = document.getRootElement();
    List<Element> children = root.getChildren();
    for(Element element : children) {
        parseelement(element);
    }
}

private void parseelement(Element element) {
    System.out.println("Element:" + element.getName());
    String name = element.getAttributeValue("name");
    if(name != null) {
        System.out.println("name: " + name);    
    }
    String type = element.getAttributeValue("type");
    if(type != null) {
        System.out.println("type: " + type);
    }
    String value = element.getAttributeValue("value");
    if(value != null) {
        System.out.println("value: " + value);
    }
    List<Element> children = element.getChildren();
    if(children != null) {
        for(Element child : children) {
            parseelement(child);
        }
    }
}

これは以下を出力します:

Element: Package
Element: IO
name: Bus
type: Class
Element: ResourceAttribute
name: Bandwidth
type: KiloBitPerSecond
value: 50

解析中に、各要素の名前を確認し、対応するオブジェクトをインスタンス化します。そのためには、各要素を処理する別のメソッドを作成することをお勧めします。例えば:

void parsePackage(Element packageElement) { ... }
parseIO(Element ioElement) { ... }
void parseResourceAttribute(Element resourceAttributeElement) { ... }
于 2013-09-24T15:03:51.133 に答える