在處理用程式語言讀取 XML 的過程中,搜尋過一些網路範例;
雖然,有不少範例,卻如無法解決個人的實際需求。
主因是大多數的範例其讀取的 XML 內容,是屬於“正規化”型的資料;也就是 XML 檔案除了根元素外,就是一階式的資料。
而 XML 資料的實際內容如下:
---------------------------------
<?xml version = "1.0" encoding = "UTF-8" ?>
<videos>
<head>
<item>0</item>
<url></url>
<name>太古歷史</name>
<description></description>
<privacy>public</privacy>
</head>
<details>
<detail>
<item>1</item>
<url>https://www.youtube.com/watch?v=b75lPfjI4k8</url>
<name>第一课:完美的世界</name>
<description></description>
</detail>
<detail>
<item>2</item>
<url>https://www.youtube.com/watch?v=Vhi-ZrpnNOY</url>
<name>第二课:失而复得的乐园</name>
<description></description>
</detail>
。。。。。
</details>
</videos>
-------------------------------
PS:上述 XML 檔案(video.xml)將會在未來幾篇文章中,再次提及。它將被使用在 YouTube 視頻檔案的管理及應用裡!
從 XML 的內容樣式來看,它具有表頭標籤(head)、表身群標籤(details))、表身標籤(detail)等區塊。
程式要負責將表頭的5個元素、將表身『每一個』節點的4個元素值,加以讀出並存放在公用變數中。
- 宣告公用變數
- 讀取表頭元素值
- 讀取表身每一個節點的元素值
程式如下:
================================
static string PlaylistItem;
static string PlaylistURL;
static string PlaylistName;
static string PlaylistDesc;
static string PlaylistPrivacy;
static int XmlDetailsCnt;
static int XmlDetailElements = 4;
static string[] aryDB; // 程式中,動態定義陣列大小
static string[,] aryXML; // 程式中,動態定義陣列大小
// 讀取表頭元素值
static void GetXML_Header(string pXML)
{
XmlDocument doc = new XmlDocument();
doc.Load(pXML);
XmlNodeList nodes = doc.DocumentElement.SelectNodes("/videos/head");
PlaylistItem = nodes[0].SelectSingleNode("item").InnerText;
PlaylistURL = nodes[0].SelectSingleNode("url").InnerText;
PlaylistName = nodes[0].SelectSingleNode("name").InnerText;
PlaylistDesc = nodes[0].SelectSingleNode("description").InnerText;
PlaylistPrivacy = nodes[0].SelectSingleNode("privacy").InnerText;
}
// 讀取表身每一個節點的元素值
static void GetXML_Details(string pXML)
{
XmlDocument doc = new XmlDocument();
doc.Load(pXML);
XmlNodeList nodes = doc.DocumentElement.SelectNodes("/videos/details/detail");
XmlDetailsCnt = nodes.Count;
aryXML = new string[XmlDetailsCnt, XmlDetailElements];
aryDB = new string[XmlDetailsCnt];
int i = 0;
foreach (XmlNode node in nodes)
{
aryXML[i, 0] = node.SelectSingleNode("item").InnerText;
aryXML[i, 1] = node.SelectSingleNode("url").InnerText;
aryXML[i, 2] = node.SelectSingleNode("name").InnerText;
aryXML[i, 3] = node.SelectSingleNode("description").InnerText;
aryDB[i] = PaserVideoID(aryXML[i, 1]);
i = i + 1;
}
}
================================