2012-04-07 41 views
0

我的字符串是这样的:Java,如何使用子串来获取我的数据?

<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.

非常感谢您的帮助。

+1

如果字符串真的是在你的例子一样简单,你可以使用像'yourString.replaceFirst一个正则表达式( “*?名称= \ ”ATILIA \“>(\\ d +)<。*” ,“$ 1”)。但是,像@Lukas Eder所建议的那样,你会更安全地使用xml解析库和xpath。 – nansen 2012-04-07 10:30:22

+0

什么正则表达式?这只是xml – kommradHomer 2012-04-07 10:39:24

+0

@kommradHomer:我没有建议它作为首选的方式。只是说,如果你知道你正在处理的是什么类型的字符串和一个简单的单行可以做的,为什么还要使用任何XML库? – nansen 2012-04-07 10:46:50

回答

1

你可以使用内置的XML类Java的。我给你写了一个小例子;一个类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; 
    } 

} 
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作为普通字符串,并开始解析/用自己的子读它方法。这种技术有很多可能出错的地方!

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解析器来做到这一点 - 这仅仅是简单的字符串操作

+0

我个人不会建议那些不知道简单的Java String操作函数的人应该开始手动解析XML ...他们会对他们可以犯的错误感到非常沮丧:-) – 2012-04-07 10:26:28

+0

我只是提供这个答案,因为标签和问题标题提到了子字符串,所以认为他们可能要求使用子字符串特定的方法而不是XML解析。我完全同意,但有很多潜在的错误。 – wattostudios 2012-04-07 10:28:37

+0

是的,在这种情况下很难说... – 2012-04-07 10:32:57

0

只是分析XML,并把自己的价值观由名称键入一个HashMap

建议用于解析XML参赛者元素的属性Xom

+0

你能在代码中显示一些例子吗? – 2012-04-07 10:45:22

+0

啊没有。我对这个答案的所有意图仅仅是为了表达他应该使用XML解析的事实 – kommradHomer 2012-04-07 10:48:39

相关问题