-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();

当然,您还有很多其他选择。另一种方法是在没有任何第三方库的情况下解析 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 类。我给你写了一个小例子;一个名为 Main 的类,带有一个 getNumber 方法,如果未找到给定的名称,该方法将引发异常。

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 并将您的值放入以参赛者元素的名称属性为键的 HashMap 中

解析 XML Xom的建议

于 2012-04-07T10:41:09.687 回答