2

XML ファイルを入力として取り (ファイル内のデータは、本のインデックス ページのようなもので、章名やその他の情報が含まれています)、コードを使用してそこからいくつかの値を取得します。ファイルから取得する 3 つの値は次のとおりです。

Title (a long string of title to the chapter)
Number (chapter number)
ID (This is an ID associated with chapter, format: xxx-yy-zzz)

私がする必要があるのは、これらの値を Excel シートの 5 つの異なる列に格納することです (ID の各部分が異なるサブ ID であるハイフンの周りで ID を分割することにより)。

そのため、ファイルを反復処理し、タイトル、番号、ID を取得し、それらを間に「-」を付けて連結して、形式の文字列のようにします。

タイトル番号-SubID1-SubID2-SubID3

そして、これらの文字列をそれぞれリストに追加します。リストは後で反復し、"-" から分割して 5 つの値をそれぞれ取得し、Excel シートに書き込みます。

私のファイルには 113 個の一意のオカレンスがありますが、Excel シートでは 103 個の一意のオカレンスしか得られず、10 個の値が重複していることに気付きました。そしてどういうわけか、そこにあるはずの10個の値がシートにありません。何が起こっているのか本当に混乱しています。

編集:

ここで、XML ドキュメントと一緒に送信する各 ID の文字列を取得します。

 public static String getBooksFromDoc(Document doc, String id)
        throws Exception {
    String idset = null;
    String title = null;
    String num = null;
    doc.getDocumentElement().normalize();
    XPath xPath = XPathFactory.newInstance().newXPath();
    XPathExpression xPathExpr = (XPathExpression) xPath
            .compile("//document[@id ='" + id + "']");
    NodeList nlist = (NodeList) xPathExpr.evaluate(doc,
            XPathConstants.NODESET);
    for (int i = 0; i < nlist.getLength(); i++) {
        rulebookProp = new RulebookProperties();
        Node nnode = nlist.item(i);
        XPathExpression xPath1 = (XPathExpression) xPath
                .compile(".//idset");
        Element eelement = (Element) nnode;
        Node idNode = (Node) xPath1.evaluate(eelement, XPathConstants.NODE);
        idset = idNode.getFirstChild().getNodeValue();

        XPathExpression xPath2 = (XPathExpression) xPath
                .compile(".//title");
        Element eelement1 = (Element) nnode;
        Node idNode1 = (Node) xPath2.evaluate(eelement1,
                XPathConstants.NODE);
        if (idNode1 == null) {
            title = " ";
        } else {
            title = idNode1.getFirstChild().getNodeValue();
        }

        XPathExpression xPath3 = (XPathExpression) xPath
                .compile(".//number");
        Element eelement2 = (Element) nnode;
        Node idNode2 = (Node) xPath3.evaluate(eelement2,
                XPathConstants.NODE);
        if (idNode2 == null) {
            num = " ";
        } else {
            num = idNode2.getFirstChild().getNodeValue();
        }
    }
    return title + "-" + num + "-" + idset;
}

返された各文字列をリストに追加します。

List<String> books = new ArrayList<String>();

books.add(getBooksFromDoc(xmlDoc, id);

これは、リストを使用して 5 つの値を取得する方法です。(注: 場合によってIDは、xxx または xxx-yyy または xxx-yyy-zzz のように見えます。つまり、3 つの部分または 1 つの部分で構成されている可能性があります。(これは私のコードの条件を説明しています))

public static List<BookObject> getBookEntries(
        List<String> books) {
    String bookTitle = " ";
    String bookID = " ";
    String bookElementID = " ";
    String recordID = " ";
    String bookNo = " ";


    for String book : books) {

        String[] parts = book.split("-");
        if (parts.length == 5) {
            for (int i = 0; i < parts.length; i++) {
                bookTitle = parts[0]
                bookNo = parts[1]
                bookID = parts[2];
                bookElementID = parts[3];
                recordID = parts[4];
                bookObj = new BookObject();
                bookObj.setBookTitle(bookTitle);
                bookObj.setBookNo(bookNo);
                bookObj.setBookId(bookID);
                bookObj.setBookElementId(bookElementID);
                bookObj.setRecordId(recordID);
            }
        } else if (parts.length == 4) {
            for (int i = 0; i < parts.length; i++) {
                bookTitle = parts[0]
                bookNo = parts[1]
                bookID = parts[2];
                bookElementID = parts[3];
                bookObj = new BookObject();
                bookObj.setBookTitle(bookTitle);
                bookObj.setBookNo(bookNo);
                bookObj.setBookId(bookID);
                bookObj.setBookElementId(bookElementID);
                bookObj.setRecordId(recordID);
            }
        } else if (ids.length == 1) {
            for (int i = 0; i < parts.length; i++) {
                bookTitle = parts[0]
                bookNo = parts[1]
                bookID = parts[2];
                bookObj = new BookObject();
                bookObj.setBookTitle(bookTitle);
                bookObj.setBookNo(bookNo);
                bookObj.setBookId(bookID);
                bookObj.setBookElementId(bookElementID);
                bookObj.setRecordId(recordID);
            }       
        }
        bookEntries.add(bookObj);
    }
    return bookEntries;
}

後で、それぞれを反復処理しbookEntriesて Excel シートに追加します。(これで少しわかりやすくなったと思います。)

for (int i = 0; i < listEntries.size(); i++) {
            Row dataRow = sheet.createRow(i+1);
            dataRow.createCell(0).setCellValue(
                    bookEntries.get(i).getBookTitle());
            dataRow.createCell(1).setCellValue(
                    bookEntries.get(i).getBookId());
            dataRow.createCell(2).setCellValue(
                    bookEntries.get(i).getBookElementId());
            dataRow.createCell(3).setCellValue(
                    bookEntries.get(i).getRecordId());
            dataRow.createCell(4).setCellValue(
                    bookEntries.get(i).getBookNo());
}
4

1 に答える 1

2

私は答えを見つけました。これらのエントリが欠落している理由は、XML のデータ形式にありました。一部のエントリ (10 件) には、タイトルにハイフンが含まれていました。ほとんどのエントリの名前にハイフンが含まれていなかったので、私はこれを誤って考慮していませんでした。したがって、これにより、これらの文字列が 6 つの部分に分割されましたが、これは私のコードでは処理されませんでした。私はそれが最大で5つの部分に分割されると想定していました. 私は今それを修正しました、そしてそれはうまくいきます:)

于 2013-09-06T20:01:15.833 に答える