3

次の XML コードがあります。

<CampaignFrameResponse
  xmlns="http://Qsurv/api"
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Message>Success</Message>
  <Status>Success</Status>
  <FrameHeight>308</FrameHeight>   
  <FrameUrl>http://delivery.usurv.com?Key=a5018c85-222a-4444-a0ca-b85c42f3757d&amp;ReturnUrl=http%3a%2f%2flocalhost%3a8080%2feveningstar%2fhome</FrameUrl> 
</CampaignFrameResponse>

私がやろうとしているのは、ノードを抽出して変数に割り当てることです。たとえば、FrameHeightvalue を含むという変数があります308

これは私がこれまでに持っているJavaコードです:

private void processNode(Node node) {
    NodeList nodeList = node.getChildNodes();
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node currentNode = nodeList.item(i);
       if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
            //calls this method for all the children which is Element
            LOG.warning("current node name: " + currentNode.getNodeName());
            LOG.warning("current node type: " + currentNode.getNodeType());
            LOG.warning("current node value: " + currentNode.getNodeValue());
            processNode(currentNode);
       }
    }

}

これはノード名、タイプ、および値を出力しますが、それぞれの値を適切な名前の変数に割り当てる最良の方法は何ですか? 例えばint FrameHeight = 308

これは、nodeValue 変数が null を返し続ける私の更新されたコードです。

processNode(Node node) {
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
    Node currentNode = nodeList.item(i);
    if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
        //calls this method for all the children which is Element
        String nodeName = currentNode.getNodeName();
        String nodeValue = currentNode.getNodeValue();
        if(nodeName.equals("Message")) {
            LOG.warning("nodeName: " + nodeName); 
            message = nodeValue;
            LOG.warning("Message: " + message); 
        } 
        else if(nodeName.equals("FrameHeight")) {
            LOG.warning("nodeName: " + nodeName); 
            frameHeight = nodeValue;
            LOG.warning("frameHeight: " + frameHeight);
        }
        processNode(currentNode);
    }
}

}

4

6 に答える 6

2

DOMSAX、を使用できますがPull-Parser、次の API を使用するとよいでしょう。

- JAXP & JAXB

- Castor

例: DOM 解析

DocumentBuilderFactory odbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder odb =  odbf.newDocumentBuilder();
            InputSource is = new InputSource(new StringReader(xml));
            Document odoc = odb.parse(is);
            odoc.getDocumentElement().normalize ();    // normalize text representation
            System.out.println ("Root element of the doc is " + odoc.getDocumentElement().getNodeName());
            NodeList LOP = odoc.getElementsByTagName("response");

                Node FPN =LOP.item(0);
                try{
                if(FPN.getNodeType() == Node.ELEMENT_NODE)
                    {

                    Element token = (Element)FPN;

                    NodeList oNameList1 = token.getElementsByTagName("user_id");
                    Element firstNameElement = (Element)oNameList1.item(0);
                    NodeList textNList1 = firstNameElement.getChildNodes();
                    this.setUser_follower_id(Integer.parseInt(((Node)textNList1.item(0)).getNodeValue().trim()));
                    System.out.println("#####The Parsed data#####");
                    System.out.println("user_id : " + ((Node)textNList1.item(0)).getNodeValue().trim());
                    System.out.println("#####The Parsed data#####");
于 2012-10-11T10:28:25.903 に答える
2

私はしばらくの間 (10 年以上) Java で XML を扱っており、多くの代替手段 (カスタム テキスト解析、独自の API、SAX、DOM、Xmlbeans、JAXB など) を試してきました。私はいくつかのことを学びました:

  • 標準に固執します。プロプライエタリ API を使用しないでください。ただし、標準の Java API (SAX、DOM、Stax などを含む JAXP) を使用してください。コードの移植性と保守性が向上し、XML ライブラリのバージョンが変更されて互換性が失われても変更されません (これは非常に頻繁に発生します)。
  • 時間をかけて XML 技術を学びましょう。少なくとも XSD、XSLT、および XPath (XSLT に必要) の包括的な知識をお勧めします。時間がない場合は、XSD に集中してください。
  • 可能な限り、自動 XML コード生成/解析を利用してください。これは、XSD を知っていることを意味します。長い目で見れば、最初の努力が報われます。コードは長期的に保守しやすくなり、解析/整列化は大幅に最適化され (通常、「手動」の JAXP API を使用する場合よりも最適化されます)、XML 検証 (既に XSD を持っています) が行われます。実行できます (コードのチェックが減り、不正な形式の XML によるアプリのクラッシュに対する安全性が高まり、統合作業が減ります)。XSD コードを記述するだけで、データ (Java Beans) を処理するために必要なほとんどすべての Java コードが生成されます。

最近では、そのような XML を解析する必要があるときはいつでも、コード生成を使用する傾向があります。その標準は JAXB です (xmlbeans は死んでおり、他の代替手段は成熟しておらず、広く使用されていない可能性があります)。あなたの場合、ドキュメントを可能な限り詳細に定義するXSDを定義します(つまり、複数の値しか持てない文字列を使用する場合は、「xs:string」タイプではなく列挙型を使用してください)。次のようになります。

<xs:schema attributeFormDefault="unqualified"
    elementFormDefault="qualified" targetNamespace="http://Qsurv/api"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="CampaignFrameResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element type="xs:string" name="Message" />
                <xs:element type="Status" name="Status" />
                <xs:element type="xs:short" name="FrameHeight" />
                <xs:element type="xs:anyURI" name="FrameUrl" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <<xs:simpleType name="Status">
        <xs:annotation>
            <xs:appinfo>
                <jaxb:typesafeEnumClass>
                    <jaxb:typesafeEnumMember name="SUCCESS"
                        value="Success" />
                    <jaxb:typesafeEnumMember name="FAILURE"
                        value="Failure" />
                </jaxb:typesafeEnumClass>
            </xs:appinfo>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="Success" />
            <xs:enumeration value="Failure" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

次に、JAXB ツール (xjc コンパイラ オプションを参照) を使用してコードを生成し、生成された Java Bean を XML との間でマーシャリング/アンマーシャリングする方法の例を確認します。

于 2012-10-11T11:03:03.580 に答える
1

あなたの場合、Xstreamはサポートしません。オブジェクトをxmlに変換してから元に戻すために使用できます。xml が CampaignFrameResponse クラスのインスタンスから生成される場合、xstream を使用できます。

それ以外の場合は、次のようにチェックするだけです

String nodeName = currentNode.getNodeName()
String nodeValue = currentNode.getNodeValue() ;
if( nodeName.equals("Message")){
     message = nodeValue ;
} else if( nodeName.equals("FrameHeight") {
     frameHeight = nodeValue ;
}

int 値が必要な場合は解析する必要があります。

于 2012-10-11T10:48:48.387 に答える
1

You could of course create a name-value map and update the map as you traverse the XML. At the end of the parsing you could look for the particular key in the map. Java doesn't let you create variables programmatically so you won't be able to generate a variable with its name based on the XML data.

Other than for style and readability, your decision to populate data-structures from XML depends on how well-defined the XML is and how much would its schema could possibly change in future. You could ask yourself questions like : Can the node-name change in future? Can XML subsections be introduced that would circumscribe this section? This might help you choose a certain parser (SAX/DOM or higher-level object-parsing APIs).

Of course, if you have no control on the XML definition there is little you can do other than parsing what you've got.

于 2012-10-11T11:23:43.830 に答える
0

--x - stream.github.io--をいくつかの境界注釈とともに使用すると、コーディングをほとんど行わずにXMLからオブジェクトを非常に高速に作成できることをお勧めします。

于 2012-10-11T10:32:43.643 に答える
0

xml を直接解析することはお勧めしませんが (強制されない限り)、代わりにhttp://x-stream.github.io/などの外部ライブラリを使用することをお勧めします。xml スキーマを表すオブジェクトを作成すると、ライブラリがそのオブジェクトを作成するという考え方です。

于 2012-10-11T10:32:20.993 に答える