展示
xml文件
-
SecondaryBlankApp/Assets/user_info_data.xml
<?xml version="1.0" encoding="utf-8" ?>
<userInfos>
<userInfo id="user_01" class="box-01 box-02">
<name>Lee</name>
<age>24</age>
</userInfo>
<userInfo id="user_02">
<name>张三</name>
<age>18</age>
</userInfo>
</userInfos>
源码
SAX
// SAX
private string TAG = "DataMessage";
private string _xmlData = "";
var xmlText = FindViewById<TextView>(Resource.Id.xml_text);
var btn01 = FindViewById<Button>(Resource.Id.btn_01);
if (btn01 != null)
btn01.Click += delegate
{
SaxHelper.XmlData = "";
if (xmlText == null) return;
// 获取文件资源建立输入流对象
var stream = Assets?.Open("user_info_data.xml");
// 创建XML解析处理器
var saxHelper = new SaxHelper();
// 得到SAX解析工厂 创建SAX解析器
var saxParser = SAXParserFactory.NewInstance()?.NewSAXParser();
// 将xml解析处理器分配给解析器,对文档进行解析,将事件发送给处理器
saxParser?.Parse(stream, saxHelper);
stream?.Close();
Log.Debug(TAG, SaxHelper.XmlData);
xmlText.Text = $"SAX ---> \n{SaxHelper.XmlData}";
};
using Android.Util;
using Org.Xml.Sax;
using Org.Xml.Sax.Helpers;
namespace SecondaryBlankApp.Scripts
{
internal class SaxHelper : DefaultHandler
{
private string TAG = "DataMessage";
public static string XmlData;
public override void StartDocument()
{
base.StartDocument();
}
// localName 开始标签名 attributes 属性数组
public override void StartElement(string uri, string localName, string qName, IAttributes attributes)
{
base.StartElement(uri, localName, qName, attributes);
string attrString = null;
for (var i = 0; i < attributes.Length; i++)
attrString += $" {attributes.GetLocalName(i)}=\"{attributes.GetValue(i)}\"";
XmlData += $"<{localName}{attrString}>";
Log.Debug(TAG, $"<{localName}{attrString}>");
}
public override void Characters(char[] ch, int start, int length)
{
base.Characters(ch, start, length);
var content = new string(ch, start, length).Trim();
XmlData += content;
if (content != string.Empty) Log.Debug(TAG, $"{content}");
}
// localName 结束标签名
public override void EndElement(string uri, string localName, string qName)
{
base.EndElement(uri, localName, qName);
XmlData += $"</{localName}>";
Log.Debug(TAG, $"</{localName}>\n");
}
public override void EndDocument()
{
base.EndDocument();
}
}
}
DOM
// DOM
private string TAG = "DataMessage";
private string _xmlData = "";
var xmlText = FindViewById<TextView>(Resource.Id.xml_text);
var btn02 = FindViewById<Button>(Resource.Id.btn_02);
if (btn02 != null)
btn02.Click += delegate
{
_xmlData = "";
// DOM解析器的工厂 dom解析器
var builder = DocumentBuilderFactory.NewInstance()?.NewDocumentBuilder();
// 解析的xml文件读入Dom解析器
var document = builder?.Parse(Assets?.Open("user_info_data.xml"));
// 文档根节点名称
if (document?.DocumentElement != null)
{
var rootTagName = document.DocumentElement.NodeName;
// 获取节点列表
var nodeList = document.GetElementsByTagName(rootTagName);
GetNodeElement(nodeList);
}
Log.Debug(TAG, _xmlData);
if (xmlText != null) xmlText.Text = $"DOM ---> \n{_xmlData}";
};
// 递归获取元素节点和内容
private void GetNodeElement(INodeList nodeList)
{
for (var i = 0; i < nodeList.Length; i++)
{
var node = nodeList.Item(i);
var attrString = "";
if (node is { Attributes: { } })
{
for (var j = 0; j < node.Attributes.Length; j++)
{
var attr = node.Attributes.Item(j);
if (attr != null) attrString += $" {attr.NodeName}=\"{attr.TextContent}\"";
}
}
if (node == null) continue;
switch (node.NodeType)
{
case Node.ElementNode:
_xmlData += $"<{node.NodeName}{attrString}>";
Log.Debug(TAG, $"<{node.NodeName}{attrString}>");
break;
case Node.TextNode:
_xmlData += $"{new string(node.TextContent).Trim()}";
Log.Debug(TAG, $"{new string(node.TextContent).Trim()}");
break;
}
GetNodeElement(node.ChildNodes);
if (node.NodeType != Node.ElementNode) continue;
_xmlData += $"</{node.NodeName}>";
Log.Debug(TAG, $"</{node.NodeName}>");
}
}
XmlReader
// XmlReader
private string TAG = "DataMessage";
private string _xmlData = "";
var xmlText = FindViewById<TextView>(Resource.Id.xml_text);
var btn03 = FindViewById<Button>(Resource.Id.btn_03);
if (btn03 != null)
btn03.Click += async delegate
{
_xmlData = "";
var stream = Assets?.Open("user_info_data.xml");
var settings = new XmlReaderSettings
{
Async = true
};
if (stream == null) return;
var reader = XmlReader.Create(stream, settings);
while (await reader.ReadAsync())
{
switch (reader.NodeType)
{
case XmlNodeType.XmlDeclaration:
_xmlData += $"<?xml {reader.Value} ?>";
Log.Debug(TAG, $"<?xml {reader.Value} ?>");
break;
case XmlNodeType.Element:
_xmlData += $"<{reader.Name}";
Log.Debug(TAG, $"<{reader.Name}");
var attrString = "";
if (reader.HasAttributes)
{
for (var i = 0; i < reader.AttributeCount; i++)
{
reader.MoveToAttribute(i);
attrString += $" {reader.Name}=\"{reader.Value}\"";
}
}
_xmlData += $"{attrString}>";
Log.Debug(TAG, $"{attrString}>");
break;
case XmlNodeType.Text:
var content = await reader.GetValueAsync();
_xmlData += content;
Log.Debug(TAG, content);
break;
case XmlNodeType.EndElement:
_xmlData += $"</{reader.Name}>";
Log.Debug(TAG, $"</{reader.Name}>");
break;
}
}
Log.Debug(TAG, _xmlData);
if (xmlText != null) xmlText.Text = $"XmlReader ---> \n{_xmlData}";
};