Android で XML を操作する 3 つの方法のまとめ
Android では、一般的に XML ファイルを操作する方法がいくつかあります: SAX 操作、Pull 操作、DOM 操作など。その中で、DOM メソッドは誰にとっても最も馴染み深いものかもしれません。また、XML は業界で認められたデータ交換形式であり、さまざまなプラットフォームや言語で広く使用され、実装されています。スタンダードタイプ、信頼性、安全性・・・間違いありません。 Android プラットフォームでは、データ ストレージとデータ交換を実装する場合、xml データ形式と xml ファイルを使用することがよくあります。
ヒント:Android に保存されるデータには通常、次のタイプが含まれます: SharedPreferences (パラメーター化)、XML ファイル、sqllite データベース、ネットワーク、ContentProvider (コンテンツ プロバイダー) など。 Android では、一般的に XML ファイルを操作する方法がいくつかあります: SAX 操作、Pull 操作、DOM 操作など。その中でも DOM 方式は誰にとっても最も馴染みのある方式であり、W3C 標準にも準拠しています。
1) Java プラットフォームには、DOM4J などの優れたオープン ソース パッケージがあり、これにより、誰もが DOM 標準を使用して XML ファイルを操作することが大幅に容易になります。 JavaScript では、ブラウザーの解析エンジンが異なると、DOM に対する解析と操作が若干異なります (ただし、これはこの章の焦点ではありません)。 DOM メソッドには欠点もあります。通常、xml ファイルは一度ロードされ、DOM の
api を使用して解析されます。これは大量のメモリを消費し、パフォーマンスに一定の影響を与えます。 Android スマートフォンの構成は常にアップグレードされていますが、メモリの点では依然として従来の PC と競合できません。したがって、Android では、DOM を使用して XML を解析および操作することは推奨されません。
コードは次のとおりです:package cn.itcast.service;
import java.io.InputStream;import java.util.ArrayList;import java.util.List;
import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;
import cn.itcast.model.Person;
public class DomPersonService {
public List<Person> getPersons(InputStream stream) throws Throwable
{
List<Person> list =new ArrayList<Person>();
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
DocumentBuilder builder =factory.newDocumentBuilder();
Document dom = builder.parse(stream);//解析完成,并以dom树的方式存放在内存中。比较消耗性能
//开始使用dom的api去解析
Element root = dom.getDocumentElement();//根元素
NodeList personNodes = root.getElementsByTagName("person");//返回所有的person元素节点
//开始遍历啦
for(int i=0;i<personNodes.getLength();i++)
{
Person person =new Person();
Element personElement =(Element)personNodes.item(i);
person.setId(new Integer( personElement.getAttribute("id")));//将person元素节点的属性节点id的值,赋给person对象
NodeList personChildrenNodes =personElement.getChildNodes();//获取person节点的所有子节点
//遍历所有子节点
for(int j=0;j<personChildrenNodes.getLength();j++)
{
//判断子节点是否是元素节点(如果是文本节点,可能是空白文本,不处理)
if(personChildrenNodes.item(j).getNodeType()==Node.ELEMENT_NODE)
{
//子节点--元素节点
Element childNode =(Element)personChildrenNodes.item(j);
if("name".equals(childNode.getNodeName()))
{
//如果子节点的名称是“name”.将子元素节点的第一个子节点的值赋给person对象
person.setName(childNode.getFirstChild().getNodeValue());
}else if("age".equals(childNode.getNodeValue()))
{
person.setAge(new Integer(childNode.getFirstChild().getNodeValue()));
}
}
}
list.add(person);
}
return list;
}}
2)SAX (Simple API for XML) は非常に広く使用されている XML 解析標準であり、通常はハンドラー モードを使用して XML ドキュメントを処理します。この処理モードは、私たちが普段慣れ親しんでいる理解方法とは大きく異なります。私の周りには、SAX に初めて触れたときに理解するのが難しいと感じる人がよくいます。実際、SAX は複雑ではなく、その名前が示すように、XML ドキュメントをより簡単な方法で処理できるようにするための考え方が異なるだけです。
コードは次のとおりです:package cn.itcast.service;
import java.io.InputStream;import java.util.ArrayList;import java.util.List;
import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;
import cn.itcast.model.Person;
public class SAXPersonService { public List<Person> getPersons(InputStream inStream) throws Throwable
{
SAXParserFactory factory = SAXParserFactory.newInstance();//工厂模式还是单例模式?
SAXParser parser =factory.newSAXParser();
PersonParse personParser =new PersonParse();
parser.parse(inStream, personParser);
inStream.close();
return personParser.getPerson();
}
private final class PersonParse extends DefaultHandler
{ private List<Person> list = null;
Person person =null;
private String tag=null;
public List<Person> getPerson()
{
return list;
}
@Override public void startDocument() throws SAXException
{
list =new ArrayList<Person>();
}
@Override public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if("person".equals(localName))
{
//xml元素节点开始时触发,是“person”
person = new Person();
person.setId(new Integer(attributes.getValue(0)));
}
tag =localName;//保存元素节点名称 } @Override public void endElement(String uri, String localName, String qName)
throws SAXException {
//元素节点结束时触发,是“person”
if("person".equals(localName))
{
list.add(person);
person=null;
}
tag =null;//结束时,需要清空tag
} @Override public void characters(char[] ch, int start, int length)
throws SAXException { if(tag!=null)
{
String data = new String(ch,start,length);
if("name".equals(tag))
{
person.setName(data);
}else if("age".equals(tag))
{
person.setAge(new Integer(data));
}
}
}
}
}
3) Pull 解析は両方とも Android カーネルに組み込まれている軽量の解析です。プルをサポートするためにサードパーティの jar パッケージを追加する必要はありません。 Pull 解析と Sax 解析の違いは、(1) pull は、xml ファイルを読み取った後、対応する
package cn.itcast.service; import java.io.InputStream;import java.io.Writer;import java.util.ArrayList;import java.util.List; import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlSerializer; import android.util.Xml; import cn.itcast.model.Person; public class PullPersonService { //保存xml文件 public static void saveXML(List<Person> list,Writer write)throws Throwable { XmlSerializer serializer =Xml.newSerializer();//序列化 serializer.setOutput(write);//输出流 serializer.startDocument("UTF-8", true);//开始文档 serializer.startTag(null, "persons"); //循环去添加person for (Person person : list) { serializer.startTag(null, "person"); serializer.attribute(null, "id", person.getId().toString());//设置id属性及属性值 serializer.startTag(null, "name"); serializer.text(person.getName());//文本节点的文本值--name serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(person.getAge().toString());//文本节点的文本值--age serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); write.flush(); write.close(); } public List<Person> getPersons(InputStream stream) throws Throwable { List<Person> list =null; Person person =null; XmlPullParser parser =Xml.newPullParser(); parser.setInput(stream,"UTF-8"); int type =parser.getEventType();//产生第一个事件 //只要当前事件类型不是”结束文档“,就去循环 while(type!=XmlPullParser.END_DOCUMENT) { switch (type) { case XmlPullParser.START_DOCUMENT: list = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: String name=parser.getName();//获取解析器当前指向的元素名称 if("person".equals(name)) { person =new Person(); person.setId(new Integer(parser.getAttributeValue(0))); } if(person!=null) { if("name".equals(name)) { person.setName(parser.nextText());//获取解析器当前指向的元素的下一个文本节点的文本值 } if("age".equals(name)) { person.setAge(new Integer(parser.nextText())); } } break; case XmlPullParser.END_TAG: if("person".equals(parser.getName())) { list.add(person); person=null; } break; } type=parser.next();//这句千万别忘了哦 } return list; } }
コードをコピーします
package cn.itcast.model; public class Person {private Integer id;public Integer getId() { return id;}public void setId(Integer id) { this.id = id;} private String name;public String getName() { return name;} public void setName(String name) { this.name = name;} private Integer age;public Integer getAge() { return age;} public void setAge(Integer age) { this.age = age;} public Person(){}public Person(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age;} @Overridepublic String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";} }
以上がAndroid で XML を操作する 3 つの方法のまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

OnLeaks は、X (旧 Twitter) のフォロワーから 4,000 ドル以上を集めようとして失敗した数日後、Android Headlines と提携して Galaxy S25 Ultra のファーストルックを提供しました。コンテキストとして、h の下に埋め込まれたレンダリング イメージ

TCLは、2つの新しいスマートフォンの発表に加えて、NXTPAPER 14と呼ばれる新しいAndroidタブレットも発表しました。その巨大な画面サイズはセールスポイントの1つです。 NXTPAPER 14 は、TCL の代表的なブランドであるマット LCD パネルのバージョン 3.0 を搭載しています。

Vivo Y300 Pro は完全に公開されたばかりで、大容量バッテリーを備えた最もスリムなミッドレンジ Android スマートフォンの 1 つです。正確に言うと、このスマートフォンの厚さはわずか 7.69 mm ですが、6,500 mAh のバッテリーを搭載しています。これは最近発売されたものと同じ容量です

サムスンは、ファンエディション(FE)スマートフォンシリーズをいつアップデートするかについて、まだ何のヒントも提供していない。現時点では、Galaxy S23 FE は 2023 年 10 月初めに発表された同社の最新版のままです。

ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

Redmi Note 14 Pro Plusは、昨年のRedmi Note 13 Pro Plus(Amazonで現在375ドル)の直接の後継者として正式に発表されました。予想通り、Redmi Note 14 Pro Plusは、Redmi Note 14およびRedmi Note 14 Proと並んでRedmi Note 14シリーズをリードします。李

OnePlus の姉妹ブランドである iQOO の製品サイクルは 2023 年から 4 年で、ほぼ終わりに近づいている可能性があります。それにもかかわらず、ブランドはまだZ9シリーズの開発を終えていないと宣言しました。その最終、そしておそらく最高エンドとなる Turbo+ バリアントが、予測どおりに発表されました。 T
