Android中XML的基本操作(增、刪、改、查)
Android中XML的一些操作
解析類:
// 構(gòu)造方法
public XMLParser() {
}
/**
* 從URL獲取XML使HTTP請(qǐng)求
*
* @param url
* string
* */
public String getXmlFromUrl(String url) {
String xml = null;
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return xml;
}
/**
* 獲取XML DOM元素
*
* @param XML
* string
* */
public Document getDomElement(InputStream is) {
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
// InputSource is = new InputSource();
// is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
} catch (ParserConfigurationException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (SAXException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (IOException e) {
Log.e("Error: ", e.getMessage());
return null;
}
return doc;
}
public Document getDomDocumentUpdate(String xml) {
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
} catch (ParserConfigurationException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (SAXException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (IOException e) {
Log.e("Error: ", e.getMessage());
return null;
}
return doc;
}
/**
* 獲取節(jié)點(diǎn)值
*
* @param elem
* element
*/
public final String getElementValue(Node elem) {
Node child;
if (elem != null) {
if (elem.hasChildNodes()) {
for (child = elem.getFirstChild(); child != null; child = child
.getNextSibling()) {
if (child.getNodeType() == Node.TEXT_NODE) {
return child.getNodeValue();
}
}
}
}
return "";
}
/**
* 獲取節(jié)點(diǎn)值
*
* @param Element
* node
* @param key
* string
* */
public String getValue(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return this.getElementValue(n.item(0));
}
//XML文件有更新后,調(diào)用此方法
public void output(Document node, String filename) {
TransformerFactory transFactory = TransformerFactory.newInstance();
try {
Transformer transformer = transFactory.newTransformer();
// 設(shè)置各種輸出屬性
transformer.setOutputProperty("encoding", "UTF-8");
transformer.setOutputProperty("indent", "yes");
DOMSource source = new DOMSource(node);
// 將待轉(zhuǎn)換輸出節(jié)點(diǎn)賦值給DOM源模型的持有者(holder)
// /source.setNode(node);
StreamResult result = new StreamResult();
if (filename == null) {
// 設(shè)置標(biāo)準(zhǔn)輸出流為transformer的底層輸出目標(biāo)
result.setOutputStream(System.out);
} else {
result.setOutputStream(new FileOutputStream(filename));
}
// 執(zhí)行轉(zhuǎn)換從源模型到控制臺(tái)輸出流
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public String writeXml() {
XmlSerializer xml = Xml.newSerializer();
StringWriter writer = new StringWriter();
try {
xml.setOutput(writer);
xml.startDocument("UTF-8", true);
xml.startTag("", "blog");
xml.startTag("", "message");
xml.attribute("", "name", "xia");
xml.startTag("", "age");
xml.text("22");
xml.endTag("", "age");
xml.startTag("", "hobby");
xml.text("play");
xml.endTag("", "hobby");
xml.startTag("", "hight");
xml.text("165");
xml.endTag("", "hight");
xml.endTag("", "message");
xml.startTag("", "message");
xml.attribute("", "name", "chen");
xml.startTag("", "age");
xml.text("21");
xml.endTag("", "age");
xml.startTag("", "hobby");
xml.text("swin");
xml.endTag("", "hobby");
xml.startTag("", "hight");
xml.text("170");
xml.endTag("", "hight");
xml.endTag("", "message");
xml.endTag("", "blog");
xml.endDocument();
} catch (Exception e) {
throw new RuntimeException(e);
}
return writer.toString();
}
public boolean Write(String Filepath, String txt) {
FileOutputStream fos = null;
if (Environment.getExternalStorageState() != null) {// 這個(gè)方法在試探終端是否有sdcard!
File path = new File("sdcard/test");// 創(chuàng)建目錄
File f = new File(Filepath);// 創(chuàng)建文件
if (!path.exists()) {// 目錄不存在返回false
path.mkdirs();// 創(chuàng)建一個(gè)目錄
}
if (!f.exists()) {// 文件不存在返回false
try {
f.createNewFile();
fos = new FileOutputStream(f);
fos.write((txt).getBytes("UTF-8"));
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 創(chuàng)建一個(gè)文件
}
}
return true;
}
private static XMLParser uniqueInstance = null;
public static XMLParser getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new XMLParser();
}
return uniqueInstance;
}
}
上面的這個(gè)類中用了單例!分別定義了XML的創(chuàng)建,獲取XML的節(jié)點(diǎn)值,更新后執(zhí)行的操作!
MainActivity:
public class MainActivity extends Activity {
public static final String XMLPath = "sdcard/test/message.xml";
private Button create = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
create = (Button) findViewById(R.id.create);
}
// 自動(dòng)創(chuàng)建XML
private void createXml() {
// sdcard/test/message.xml
XMLParser.getInstance().Write(XMLPath,
XMLParser.getInstance().writeXml());
}
// 遍歷節(jié)點(diǎn),找到特定節(jié)點(diǎn)并進(jìn)行更換!
private void selectNode() {
Document document = null;
try {
FileInputStream fin = new FileInputStream(XMLPath);
document = XMLParser.getInstance().getDomElement(fin);
Node root = document.getDocumentElement();
if (root.hasChildNodes()) {
NodeList ftpnodes = root.getChildNodes();
Log.e("eee", root.getNodeName());// 根節(jié)點(diǎn) blog
for (int i = 0; i < ftpnodes.getLength(); i++) {
NodeList ftplist = ftpnodes.item(i).getChildNodes();
Node su = ftpnodes.item(i);
Log.e("eee", su.getNodeName());// message
Element e = (Element) ftpnodes.item(i);
Log.e("eee", e.getAttribute("name"));// message= xia
for (int k = 0; k < ftplist.getLength(); k++) {
Node subnode = ftplist.item(k);
Log.e("eee",
" subnode.getNodeName()"
+ subnode.getNodeName());
Log.e("eee",
"subnode.getNodeType()" + subnode.getNodeType());
Log.e("eee", subnode.getFirstChild().getNodeValue());
if (subnode.getNodeType() == Node.ELEMENT_NODE
&& subnode.getNodeName().equals("hight")) {
subnode.getFirstChild().setNodeValue("175");
XMLParser.getInstance().output(document, XMLPath);
}
}
}
}
} catch (Exception e) {
}
}
// 添加一個(gè)新的根節(jié)點(diǎn)
private void insertNode() {
Document document = null;
try {
FileInputStream fin = new FileInputStream(XMLPath);
document = XMLParser.getInstance().getDomElement(fin);
// 插入根節(jié)點(diǎn)message
/**
* <message name="wang"> <hight>180</hight> <age>22</age> </message>
*
* */
Element eltStu = document.createElement("message");
Element eltName = document.createElement("hight");
Element eltAge = document.createElement("age");
Attr attr = document.createAttribute("name");
attr.setValue("wang");
Text txtName = document.createTextNode("180");
Text txtAge = document.createTextNode("22");
eltName.appendChild(txtName);
eltAge.appendChild(txtAge);
eltStu.appendChild(eltName);
eltStu.appendChild(eltAge);
eltStu.setAttributeNode(attr);
Element eltRoot = document.getDocumentElement();
eltRoot.appendChild(eltStu);
XMLParser.getInstance().output(document, XMLPath);
} catch (Exception e) {
}
}
private void instertChildNode() {
Document document = null;
try {
FileInputStream fin = new FileInputStream(XMLPath);
document = XMLParser.getInstance().getDomElement(fin);
// 在某個(gè)根節(jié)點(diǎn)下面添加節(jié)點(diǎn)
/**
* <message name="wang"> <hight>180</hight> <age>22</age>
* <hobby>music</hobby>//這句是新添加的 </message>
*
* */
Node root = document.getDocumentElement();
NodeList ftpnodes = root.getChildNodes();
Log.e("eee", root.getNodeName());// 根節(jié)點(diǎn) blog
NodeList ftplist = ftpnodes.item(1).getChildNodes();
Node su = ftpnodes.item(1);
Log.e("eee", su.getNodeName());// message
Element e = (Element) ftpnodes.item(5);// message= wang
Log.e("eee", e.getAttribute("name"));
if (e.getAttribute("name").equals("wang")) {
Element elthoby = document.createElement("hobby");
Text txthoby = document.createTextNode("music");
elthoby.appendChild(txthoby);
Node stNode = document.getElementsByTagName("message").item(2);
stNode.appendChild(elthoby);
}
XMLParser.getInstance().output(document, XMLPath);
} catch (Exception e) {
}
}
private void removeNode() {
Document document = null;
try {
FileInputStream fin = new FileInputStream(XMLPath);
document = XMLParser.getInstance().getDomElement(fin);
// 刪除blog下的message的0個(gè)節(jié)點(diǎn)
NodeList nl = document.getElementsByTagName("message");
Node nodeDel = (Element) nl.item(0);
nodeDel.getParentNode().removeChild(nodeDel);
XMLParser.getInstance().output(document, XMLPath);
} catch (Exception e) {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
最后記得添加讀寫SDcard的權(quán)限!
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
解析Android開發(fā)優(yōu)化之:對(duì)Bitmap的內(nèi)存優(yōu)化詳解
在Android應(yīng)用里,最耗費(fèi)內(nèi)存的就是圖片資源。而且在Android系統(tǒng)中,讀取位圖Bitmap時(shí),分給虛擬機(jī)中的圖片的堆棧大小只有8M,如果超出了,就會(huì)出現(xiàn)OutOfMemory異常。所以,對(duì)于圖片的內(nèi)存優(yōu)化,是Android應(yīng)用開發(fā)中比較重要的內(nèi)容2013-05-05
Android協(xié)程的7個(gè)重要知識(shí)點(diǎn)匯總
在現(xiàn)代Android應(yīng)用開發(fā)中,協(xié)程(Coroutine)已經(jīng)成為一種不可或缺的技術(shù),它不僅簡化了異步編程,還提供了許多強(qiáng)大的工具和功能,可以在高階場(chǎng)景中發(fā)揮出色的表現(xiàn),本文將深入探討Coroutine重要知識(shí)點(diǎn),幫助開發(fā)者更好地利用Coroutine來構(gòu)建高效的Android應(yīng)用2023-09-09
Androd 勇闖高階性能優(yōu)化之布局優(yōu)化篇
Android性能優(yōu)化方面也有很多文章了,這里就做一個(gè)總結(jié),從原理到方法,工具等做一個(gè)簡單的了解,從而可以慢慢地改變編碼風(fēng)格,從而提高性能2021-10-10
Android TextView(圓?。┻吙蚝捅尘皩?shí)例詳解
這篇文章主要介紹了 Android TextView(圓?。┻吙蚝捅尘皩?shí)例詳解的相關(guān)資料,這里提供了實(shí)現(xiàn)代碼和實(shí)現(xiàn)效果圖,需要的朋友可以參考下2016-11-11
Android手勢(shì)密碼的實(shí)現(xiàn)
這篇文章主要介紹了Android手勢(shì)密碼的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-04-04
Android視頻加水印之FFmpeg的簡單應(yīng)用實(shí)例
最近有個(gè)需求,需要錄制視頻,能添加水印,所以下面這篇文章主要給大家介紹了關(guān)于Android視頻加水印之FFmpeg的簡單應(yīng)用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
Android使用廣播(BroadCast)實(shí)現(xiàn)強(qiáng)制下線的方法
這篇文章主要介紹了Android使用廣播(BroadCast)實(shí)現(xiàn)強(qiáng)制下線的方法,實(shí)例分析了Android廣播BroadCast控制activity關(guān)閉的具體步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-01-01
AndroidStudio kotlin配置詳細(xì)介紹
這篇文章主要介紹了AndroidStudio kotlin配置詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android 自定義gradle property詳解及實(shí)例代碼
這篇文章主要介紹了Android 自定義gradle property詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android 中ViewPager重排序與更新實(shí)例詳解
這篇文章主要介紹了Android 中ViewPager重排序與更新實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07

