我需要解析一个简单的xml文件。这是第一级孩子的例子:
<group>
<word>he_is</word>
<english><strong>Personal pronouns subject and the verb "to be": he is</strong><br>1) personal pronouns subject:<br>I<br>you<br>he, she, it<br>we<br>you<br>they<br>The personal pronoun at the first person singular, I, is always written with an uppercase.<br>Ordinary English uses the same pronoun for the second person singular and the second person plural: <strong>you</strong>.<br>2) conjugation of the verb <strong>to be</strong>:<br>I am<br>you are<br>he, she, it is<br>we are<br>you are<br>they are<br><strong>I am</strong> is often written and pronounced in its contracted form, <strong>I'm</strong>. So is <strong>he is</strong> → <strong>he's</strong>.</english>
<francais><strong>Les pronoms personnels sujets et le verbe "to be"</strong> <i>être</i>: <strong>he is</strong><br>1) les pronoms personnels sujets:<br>I, je<br>you, tu<br>he/she/it, il/elle/pronom neutre<br>we, nous<br>you, vous<br>they, ils/elles<br>Le pronom personnel de la première personne du singulier, I, est toujours écrit en majuscule, même au milieu d'une phrase.<br>L'anglais courant ne fait pas de distinction entre tu et vous. Dans les deux cas, le pronom est <strong>you</strong>.<br>2) conjugaison du verbe <strong>to be</strong>, <i>être</i>:<br>I am, je suis<br>you are, tu es<br>he/she/it is, il/elle/neutre est<br>we are, nous sommes<br>you are, vous êtes<br>they are ils/elles sont<br>Hormis à la première et la troisième personne du singulier, la forme unique est <strong>are</strong>.<br><strong>I am</strong>, <i>je suis</i>, est souvent écrit et prononcé sous sa forme contractée, <strong>I'm</strong>. De même <strong>he is</strong> est souvent écrit et prononcé <strong>he's</strong>.</francais>
<espanol><strong>Pronombres sujetos y el verbo "to be"</strong> <i>ser, estar</i>: <strong>he is</strong><br>1) pronombres sujetos:<br>I, yo<br>you, tú/usted<br>he/she/it, él/ella/pronombre neutro<br>we, nosostros<br>you, vosotros/ustedes<br>they, ellos/ellas<br>El pronombre personal de la primera persona del singular, I, siempre se escribe en mayúscula, incluso en medio de una frase.<br>No hay una distinción entre tú y vosotros. En cualquier caso, el pronombre es <strong>you</strong>.<br>2) conjugación del verbo <strong>to be</strong>, <i>ser / estar</i>:<br>I am, yo soy/estoy<br>you are, tú/usted eres/estás/es/está<br>he/she/it is, él/ella/neutro es/está<br>we are, nosotros somos/estamos<br>you are, vosotros/ustedes sois/estáis/son/están<br>they are ellos/ellas son/están<br>A excepción de la primera y la tercera persona del singular, la forma única es <strong>are</strong>.<br><strong>I am</strong>, <i>yo soy</i>, a menudo se escribe y se pronuncia en su forma contraída, <strong>I'm</strong>. También <strong>he is</strong> → <strong>he's</strong>.</espanol>
<chinois><strong>人称代词主格及动词“to be”:he is</strong><br>1) 人称代词主格<br>I, 我<br>you, 你<br>he, she, it, 他,她,它<br>we, 我们<br>you, 你们<br>they, 他们,她们,它们<br>第一人称单数人称代词,我,通常以大写形式书写<br>日常英语中第二人称单数和复数使用同样的代词:you。<br>2) 动词<strong>to be</strong>的词形变化:<br>I am, 我 是<br>you are 你 是<br>he/she/it is 他/她/它 是<br>we are 我们 是<br>you are 你们 是<br>they are 他们 是<br>“<strong>I am</strong>(我是)”通常在书写和发音上使用缩写形式,<strong>I’m</strong>。<strong>He is</strong> 也是一样 → <strong>he's</strong>。</chinois>
</group>
我认为有几种方法:SAX,XmlPullParser,DOM等。 SAX有不同的风格。
在某个地方读过XmlPullParser是最简单的,我用以下的临时方式
public void lireXML(String mot)
throws XmlPullParserException, IOException
{
final TextView monMessage = (TextView) findViewById(R.id.zone_trado_scrollable);
XmlResourceParser monFichierXML = getResources().getXml(R.xml.grammar);
monFichierXML.next();
int eventType = monFichierXML.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT)
{
if( (eventType == XmlPullParser.START_TAG) && (monFichierXML.getName().equalsIgnoreCase("word")) )
{
monFichierXML.next();
if ( monFichierXML.getText().equalsIgnoreCase(mot) )
{
monFichierXML.nextTag(); // word fermant
monFichierXML.nextTag(); // english ouvrant
monFichierXML.next(); // texte anglais
if (TextActivity.langueChoisie == "francais") {
monFichierXML.nextTag(); // english fermant
monFichierXML.nextTag(); // français ouvrant
monFichierXML.next(); // texte français
}
if (TextActivity.langueChoisie == "espanol") {
monFichierXML.nextTag(); // english fermant
monFichierXML.nextTag(); // français ouvrant
monFichierXML.next(); // texte français
monFichierXML.nextTag(); // français fermant
monFichierXML.nextTag(); // espanol ouvrant
monFichierXML.next(); // texte espanol
}
if (TextActivity.langueChoisie == "chinois") {
monFichierXML.nextTag(); // english fermant
monFichierXML.nextTag(); // français ouvrant
monFichierXML.next(); // texte français
monFichierXML.nextTag(); // français fermant
monFichierXML.nextTag(); // espanol ouvrant
monFichierXML.next(); // texte espanol
monFichierXML.nextTag(); // espagnol fermant
//monFichierXML.nextTag(); // russe ouvrant
//monFichierXML.next(); // texte russe
//monFichierXML.nextTag(); // russe fermant
monFichierXML.nextTag(); // chinois ouvrant
monFichierXML.next(); // texte chinois
}
// on affiche le texte à l'intérieur de la balise sélectionnée
//monMessage.setText(monFichierXML.getText());
monMessage.setText(Html.fromHtml(monFichierXML.getText()));
}
}
eventType = monFichierXML.next();
}
}
它有效,但我怀疑我没有使用最好的方法来解析我的xml文件。有什么建议吗?
答案 0 :(得分:1)
使用XMLPullParser来解析它是完全正确的,也许你的代码并不完美,但只要你很好地实现它就没有问题。
几乎所有我的xml解析器最终看起来都非常类似于
try{
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(this.getAssets().open("xml/" + source), null);
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getName().compareTo("map") == 0) {
for(int c=0;c<parser.getAttributeCount();c++)
{
if(parser.getAttributeName(c).compareTo("title")==0)
{
title = parser.getAttributeValue(c);
}
if(parser.getAttributeName(c).compareTo("bcolor")==0)
{
bColor = Color.parseColor(parser.getAttributeValue(c));
}
if(parser.getAttributeName(c).compareTo("tcolor")==0)
{
tColor = Color.parseColor(parser.getAttributeValue(c));
}
}
}
if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getName().compareTo("zone") == 0) {
int x1=0,x2=0,y1=0,y2=0;
String data="",action="";
for(int c=0;c<parser.getAttributeCount();c++)
{
if(parser.getAttributeName(c).compareTo("x1")==0)
{
x1 = Integer.parseInt(parser.getAttributeValue(c));
}
if(parser.getAttributeName(c).compareTo("y1")==0)
{
y1 = Integer.parseInt(parser.getAttributeValue(c));
}
if(parser.getAttributeName(c).compareTo("x2")==0)
{
x2 = Integer.parseInt(parser.getAttributeValue(c));
}
if(parser.getAttributeName(c).compareTo("y2")==0)
{
y2 = Integer.parseInt(parser.getAttributeValue(c));
}
if(parser.getAttributeName(c).compareTo("action")==0)
{
action = parser.getAttributeValue(c);
}
if(parser.getAttributeName(c).compareTo("data")==0)
{
data = parser.getAttributeValue(c);
}
}
zonas.add(new Zone(x1,x2,y1,y2,action,data));
}
parser.next();
}
说明:
while循环,结束条件:
parser.getEventType() != XmlPullParser.END_DOCUMENT
如果要解析的每个不同标记的语句,2条件,则必须为START_TAG且字符串必须匹配。
如果需要解析标记属性,请将for循环发送到getAttributeCount(),永远不要依赖属性顺序。
也许你需要在达到END_TAG时执行某些操作,类似于之前的条件,但是将END改为END
最后,while的最后一行必须是parser.next();
,因此它将转到xml的下一个标记。
希望这有帮助。