我正在为学校开发一个android项目。我们在editText中给出了转义的xml,我可以从editText中读取文本,但我想要的是从中捕获值。例如,这是在editText:
<ResponseSummary>
<ID>spq789pie</ID>
<No>305</No>
<ItemCount>1</ItemCount>
<Total>1.00</Total>
</ResponseSummary>
我打算做的是String response = edtResponse.getText().toString()
从editText中捕获txt。我想做的是这样的事情:
string test = (some expression that searches text and return a value text from a string)
if (test = "ID"){setID(ID);}
else if(No = "No"){setNo(No);}
else if(ItemCount = "ItemCount"){setItemCount(ItemCount);}
else if(Total = "Total"){setTotal(Total);}
基于上面的xml,我希望最后的值看起来像这样:
ID = spq789pie
No = 305
ItemCount = 1
Total = 1.00
如果你能帮助我,我真的很感激。我已经读过正则表达式的工作,但我对正则表达式并不是很好。如果还有其他方法,我也会这样做。
感谢您的所有帮助。
答案 0 :(得分:1)
您可以使用:
Matcher m = Pattern.compile("(?:<ResponseSummary>|(?!^)\\G)\\s*"
+ "<(?<key>(?>[^&]++|&(?!gt;))*)>"
+ "(?<value>(?>[^&]++|&(?!lt;))*)"
+ "</\\1>").matcher(txt);
while (m.find()) {
System.out.println(m.group("key") + " = " + m.group("value"));
}
\G
锚代表字符串的开头或最后一场比赛的结尾。否定前瞻(?!^)
用于排除第一种情况。
答案 1 :(得分:0)
由于您的数据已经是XML格式,我建议使用XML解析器,而不是使用正则表达式。 Android有一个名为XmlPullParser的内置解析器,非常容易使用。
以下是有关Android上的XML解析的更深入的指南:Parsing XML Data | Android Developers
答案 2 :(得分:0)
如果您希望将此作为字符串使用而不是像建议的savanto那样使用XML,则可以这样做(使用尽可能简单的正则表达式):
String[] lines = response.split("[\n]");
// you split the string to lines (new line char is the thing that splits the string)
String[] line = null;
String key = null;
String closureKey = null;
String strValue = null;
for (int i = 0; i < lines.length; ++i) {
line = lines[i].split("[&][lg][t][;]");
// you split every single line with specific string:
// first char is '&', second char is either 'l' or 'g'
// third char is 't', forth is ';'
key = line[1];
// line array will start and end with an empty string so you take the element with index 1, NOT 0
if (i == 0)
{
// do so something with the parent key
}
else if (i == lines.length - 1)
{
// check if parent closure key is correct
}
else
{
strValue = line[2];
closureKey = line[3];
if (key.equals("ID"))
{
// do something; value is in strValue
}
else if (key.equals("ItemCount"))
{
// do something; value is in strValue
}
//and so on...
if (!closureKey.equals("/" + key))
{
// something is wrong with this child's closure key
}
}
}