2012-06-21 66 views
0

在我的應用程序中,我需要在本地機器上使用「* C:\ Laptop1 \ folder \」,「C:\ Laptop2 \ folder *」創建文件夾結構提供的xml文件。現在XML文件具有我所追求的文件名。如何挑選XML數據中的特定標記值

我的XML代碼:

<?xml version="1.0" encoding="utf-8" ?> 
<Proj> 
<MachineIP> 
<Machine> 
<Name>Laptop 1</Name> 
<Path>C:\ZipFiles\Laptop1\folder\</Path> 
</Machine> 
<Machine> 
<Name>Laptop 2</Name> 
<Path>C:\ZipFiles\Laptop2\folder\</Path> 
</Machine> 
<Machine> 
<Name>Laptop 3</Name> 
<Path>C:\ZipFiles\Laptop2\folder\</Path> 
</Machine> 
<Machine> 
<Name>Laptop 4</Name> 
<Path>C:\ZipFiles\Laptop2\folder\</Path> 
</Machine> 
<Machine> 
<Name>Laptop 5</Name> 
<Path>C:\ZipFiles\Laptop2\folder\</Path> 
</Machine> 
<Machine> 
<Name>Laptop 6</Name> 
<Path>C:\ZipFiles\Laptop2\folder\</Path> 
</Machine> 
</MachineIP> 
</Proj> 

所有我感興趣的是知道如何獲取機/ 名稱/ 到目前爲止,我不知道如何選擇一個特定的標籤。任何人都知道如何挑選機器標籤中的每個名稱。我有一個300MB的文件來過濾掉。

我的方法是獲取機器標籤中的每個名稱並將其存儲在一個字符串中,稍後使用該字符串創建結構。但我堅持請幫助...

我的源代碼至今:

//doc created 
XmlDocument doc = new XmlDocument(); 


//loading file: 
filePath = System.IO.Directory.GetCurrentDirectory(); 
filePath = System.IO.Path.Combine(filePath + "\\", "MyConfig.xml"); 
try 
{ 
    doc.Load(filePath); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Config File Missing: " + ex.Message, "Config File Error", 
    MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
    Application.Exit(); 
} 

//fetch data: 
String[] MachineName = XMLData("PROJ/MachineIP/Machine", "Name"); 
String[] MachinePath = XMLData("PROJ/MachineIP/Machine", "Path"); 

//function XMLData(): 

string[] temp; 
XmlNodeList nodeList = doc.SelectNodes(MainNode); 
int i = 0; 
temp = new string[nodeList.Count]; 
foreach (XmlNode node in nodeList) 
{ 
    temp.SetValue(node.SelectSingleNode(SubNode).InnerText, i); 
    i++; 
} 
return temp; 

感謝, HRG

+0

你試過了什麼? –

+0

到目前爲止,我正在使用XMLDocument,但我發現很難獲取每個標記,有很多... – gaganHR

回答

1

如果你有足夠的內存加載整個文件中一氣呵成,我只是使用LINQ到XML:

var document = XDocument.Load("file.xml"); 
var names = document.Root 
        .Element("MachineIP") 
        .Elements("Machine") 
        .Elements("Name") 
        .Select(x => (string) x) 
        .ToList(); 

如果沒有有足夠的內存,您將需要使用XmlReader爲str通過輸入 - 儘管你可以從每個Machine元素創建一個XElement來處理。 (圍繞着如何做到這一點的網絡有各種各樣的網頁,包括this one。代碼並不完全如此我會寫它,但總體思路就在那裏。)

+0

感謝喬恩,我會通過鏈接ü傳遞,有沒有辦法使用XMLDocument和XmlNodeList ??? – gaganHR

+0

@hrg:當然 - 但是LINQ to XML使生活更簡單IMO。你爲什麼要使用'XmlDocument'? –

0

我能夠將它們讀入2陣列的...這裏是我的代碼如下...

//doc created 
XmlDocument doc = new XmlDocument(); 
//loading file: 
filePath = System.IO.Directory.GetCurrentDirectory(); 
filePath = System.IO.Path.Combine(filePath + "\\", "MyConfig.xml"); 
try 
{ 
    doc.Load(filePath); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Config File Missing: " + ex.Message, "Config File Error", 
    MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
    Application.Exit(); 
} 

//fetch data: 
String[] MachineName = XMLData("PROJ/MachineIP/Machine", "Name"); 
String[] MachinePath = XMLData("PROJ/MachineIP/Machine", "Path"); 
相關問題