1

私は現在、 と で開発している学術プロジェクトに取り組んでいJavaますXML。実際のタスクは、 を解析し、できればさらに処理XMLするために必要な値を渡すことです。HashMap実際の XML の短いスニペットを次に示します。

<root>
  <BugReport ID = "1">
    <Title>"(495584) Firefox - search suggestions passes wrong previous result to form history"</Title>

    <Turn>
      <Date>'2009-06-14 18:55:25'</Date>
      <From>'Justin Dolske'</From>
      <Text>
        <Sentence ID = "3.1"> Created an attachment (id=383211) [details] Patch v.2</Sentence>
        <Sentence ID = "3.2"> Ah. So, there's a ._formHistoryResult in the....</Sentence>
        <Sentence ID = "3.3"> The simple fix it to just discard the service's form history result.</Sentence>
        <Sentence ID = "3.4"> Otherwise it's trying to use a old form history result that no longer applies for the search string.</Sentence>
      </Text>
    </Turn>

    <Turn>
      <Date>'2009-06-19 12:07:34'</Date>
      <From>'Gavin Sharp'</From>
      <Text>
        <Sentence ID = "4.1"> (From update of attachment 383211 [details])</Sentence>
        <Sentence ID = "4.2"> Perhaps we should rename one of them to _fhResult just to reduce confusion?</Sentence>
      </Text>
    </Turn>

    <Turn>
      <Date>'2009-06-19 13:17:56'</Date>
      <From>'Justin Dolske'</From>
      <Text>
        <Sentence ID = "5.1"> (In reply to comment #3)</Sentence>
        <Sentence ID = "5.2"> &amp;gt; (From update of attachment 383211 [details] [details])</Sentence> 
        <Sentence ID = "5.3"> &amp;gt; Perhaps we should rename one of them to _fhResult just to reduce confusion?</Sentence>
        <Sentence ID = "5.4"> Good point.</Sentence>
        <Sentence ID = "5.5"> I renamed the one in the wrapper to _formHistResult. </Sentence>
        <Sentence ID = "5.6"> fhResult seemed maybe a bit too short.</Sentence>
      </Text>
    </Turn>

  .....
  and so on
</BugReport>

このレポートにコメントした 'Justin Dolske' のような多くのコメント投稿者がいます。私が実際に探しているのは、コメント投稿者のリストと、XML ファイル全体に書かれたすべての文章です。のようなものif(from == justin dolske) getHisAllSentences()。他のコメント投稿者についても同様です (すべての場合)。'Justin dolske' または他のコメント投稿者のみの文を取得するためにさまざまな方法を試しましたXPathSAXDOM. 私はJAVAを含むこれらのテクノロジーにまったく慣れておらず、それを達成する方法がわかりません。

上記のテクノロジーのいずれかを使用してそれを取得する方法を具体的に教えてもらえますか、それを行うための他のより良い戦略はありますか?

(注:後で、コメント者(ジャスティン・ドルスケ)のどこに、値が(すべての文)があるか、hashmapこのようなものに入れたいと思います)HashMap (key, value)key = name

緊急の助けをいただければ幸いです。

4

2 に答える 2

1

要件を達成できるいくつかの方法があります。

  • 1 つの方法はJAXBを使用することです。これについては Web 上でいくつかのチュートリアルが公開されていますので、それらを参照してください。

  • DOM を作成し、そこからデータを抽出して HashMap に入れることも考えられます。

1 つの参照実装は次のようになります。

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class XMLReader {

    private HashMap<String,ArrayList<String>> namesSentencesMap;

    public XMLReader() {
        namesSentencesMap = new HashMap<String, ArrayList<String>>();
    }

    private Document getDocument(String fileName){
        Document document = null;

        try{
            document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(fileName));
        }catch(Exception exe){
            //handle exception
        }

        return document;
    }

    private void buildNamesSentencesMap(Document document){
        if(document == null){
            return;
        }

        //Get each Turn block
        NodeList turnList = document.getElementsByTagName("Turn");
        String fromName = null;

        NodeList sentenceNodeList = null;
        for(int turnIndex = 0; turnIndex < turnList.getLength(); turnIndex++){
            Element turnElement = (Element)turnList.item(turnIndex);
            //Assumption: <From> element
            Element fromElement = (Element) turnElement.getElementsByTagName("From").item(0); 
            fromName = fromElement.getTextContent();
            //Extracting sentences - First check whether the map contains 
            //an ArrayList corresponding to the name. If yes, then use that,  
            //else create a new one                                              
            ArrayList<String> sentenceList = namesSentencesMap.get(fromName);
            if(sentenceList == null){
                sentenceList = new ArrayList<String>();
            }
            //Extract sentences from the Turn node
            try{
                sentenceNodeList = turnElement.getElementsByTagName("Sentence");
                for(int sentenceIndex = 0; sentenceIndex < sentenceNodeList.getLength(); sentenceIndex++){
                    sentenceList.add(((Element)sentenceNodeList.item(sentenceIndex)).getTextContent());
                }
            }finally{
                sentenceNodeList = null;
            }
            //Put the list back in the map                  
            namesSentencesMap.put(fromName, sentenceList);
        }
    }

    public static void main(String[] args) {
        XMLReader reader = new XMLReader();
        reader.buildNamesSentencesMap(reader.getDocument("<your_xml_file>"));

        for(String names: reader.namesSentencesMap.keySet()){
            System.out.println("Name: "+names+"\tTotal Sentences: "+reader.namesSentencesMap.get(names).size());
        }
    }
}

注:これは単なるデモンストレーションであり、必要に応じて変更する必要があります。XML に基づいて作成し、それを行う 1 つの方法を示しました。

于 2012-10-28T09:47:43.677 に答える
1

JAXB を使用して、XML 構造を反映したデータ モデルを作成することをお勧めします。

完了すると、XML を Java インスタンスにロードできます。

Map< String, List< Turn >>キーとして使用して、各「ターン」を に入れTurn.Fromます。

完了したら、次のように記述できます。

List< Turn > justinsTurn = allTurns.get( "'Justin Dolske'" );

于 2012-10-28T09:21:34.753 に答える