-1

私の文字列は次のようなものです:

<Contestants Count = "4"><Contestant Name="EBI">7</Contestant><Contestant Name="ATILIA">13</Contestant><Contestant Name="HAFIZ">10</Contestant><Contestant Name="ESTRANGED">9</Contestant></Contestants>

名前に従って番号を取り出す必要があります。たとえば、「ATILIA」の数を知りたい場合、結果は 13 になるはずです。

4

4 に答える 4

3

おそらく、何らかの方法で XML と XPath を読む必要があります。その競技者にアクセスする簡単な方法は、 jOOXを使用することです。これは、Java での XML との単純な jquery のような対話のために私が作成したライブラリです。jOOX では、次のように記述します。

// import the "$() and attr()" operators in your Java class
import static org.joox.JOOX.*;

// With CSS selector syntax, just as in jquery:
String result = $(xmlstring).find("Contestant[Name='ATILIA']").text();

// With XPath
String result = $(xmlstring).xpath("//Contestant[@Name='ATILIA']").text();

// With the jOOX API
String result = $(xmlstring).find("Contestant")
                            .filter(attr("Name", "ATILIA"))
                            .text();

もちろん、他にも多くのオプションがあります。もう 1 つは、サードパーティのライブラリを使用せずに XML を解析することです。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xmlstring)));

NodeList nodes = document.getElementsByTagName("Contestant");
for (int i = 0; i < nodes.getLength(); i++) {
  Element element = (Element) nodes.item(i);

  if ("ATILIA".equals(element.getAttribute("Name"))) {
    // Found it!
    System.out.println(element.getTextContent());
  }
}

XMLをプレーンな文字列として扱い、独自の部分文字列メソッドで解析/読み取りを開始することはお勧めしません。そのテクニックではうまくいかないことがたくさんあります!

于 2012-04-07T10:20:07.863 に答える
1

まず、名前のインデックスを見つける必要があります...

int nameIndex = line.indexOf(name);

次に、名前の後よりも小さいものと大きいものを見つける必要があります...

int greaterThan = line.indexOf(">",nameIndex);
int lessThan = line.indexOf("<",greaterThan);

そして最後にそれらの間の部分文字列を取得します...

String substring = line.substring(greaterThan+1,lessThan);

値を数値に変換する必要がある場合...

int substringNumber = Integer.parseInt(substring);

これはすべて、XMLパーサーを使用してそれを実行したくないことを前提としています-これは単純な文字列操作です

于 2012-04-07T10:23:45.357 に答える
1

Java の組み込み XML クラスを使用できます。ちょっとした例を書きました。指定された名前が見つからない場合に例外をスローするメソッド getNumber を持つクラス Main。

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class Main {

    public static void main(String[] args) throws Exception {
        System.out.println(
                getNumber(
                        "<Contestants Count = \"4\">" +
                        "<Contestant Name=\"EBI\">7</Contestant>" +
                        "<Contestant Name=\"ATILIA\">13</Contestant>" +
                        "<Contestant Name=\"HAFIZ\">10</Contestant>" +
                        "<Contestant Name=\"ESTRANGED\">9</Contestant>" +
            "</Contestants>", "ATILIA"));
    }

    static int getNumber(String xml, String name) throws Exception {
        int number = 0;
        boolean found = false;
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        InputSource inputSourse = new InputSource();
        inputSourse.setCharacterStream(new StringReader(xml));
        Document document = documentBuilder.parse(inputSourse);
        NodeList nodeList = document.getElementsByTagName("Contestant");
        for(int i = 0; i < nodeList.getLength(); i++) {
            Element element = (Element)nodeList.item(i);
            if("ATILIA".equals(element.getAttribute("Name"))) {
                number = Integer.parseInt(element.getTextContent());
                found = true;
                break;
            }
        }
        if(!found)
            throw new Exception("Name not found.");
        return number;
    }

}
于 2012-04-07T10:52:09.603 に答える
0

XML を解析し、Contestant 要素の name 属性をキーとする HashMap に値を入れるだけです。

XML Xomを解析するための提案

于 2012-04-07T10:41:09.687 に答える