2015-07-10 67 views
1

我正在寫一個程序,我試圖從一個XML文件中抓取信息,打破它,並儲存在4-5個不同的字符串的信息。這是我必須抓取XML文件的代碼。解析XML文件的字符串在C#中

private void getVersionXML() 
{ 
    sVersionConfigPath = sLocationKey + "Core\\config.xml"; //Path to XML File 
    XmlDocument xmlDoc = new XmlDocument(); 
    xmlDoc.Load(sVersionConfigPath); //Load config.xml 
    XmlNodeList xmlNodes = xmlDoc.GetElementsByTagName("PrimaryDatabase"); 
    foreach (XmlNode xmlNode in xmlNodes) 
    { 
     label1.Text = xmlNode.SelectSingleNode("database").InnerText; //Breaks Here 
    } 

} 

這裏是XML文件的樣子。

<ProgXML> 
    <PrimaryDatabase Updating="N"> 
     <Database Driver="SQL Server" Server="serverName" User="sa" Password="Iyp4kvRIS7Orl+NjkhIjvg==" Database="dbName" Owner="" Port="" UncBase="" ImpUser="" /> 
     <DataExists Action="Reset" When="5/20/2015 3:17:36 PM" /> 
     <TableCollection Name="Core" Who="CPUser" ProcessID="0" ProcessName="" Status="Complete" When="5/20/2015 3:17:47 PM" LayoutVersion="39" DataVersion="39" /> 
     <TableCollection Name="Prog" Who="CPUser" ProcessID="0" ProcessName="" Status="Complete" When="5/20/2015 3:17:47 PM" LayoutVersion="38" DataVersion="38" /> 
    </PrimaryDatabase> 
</ProgXML> 

基本上我只是想獲得的一切,顯示了<Database />標籤並將其存儲到一個字符串(或在這種情況下,只需打印到調試目的的標籤)。

然而,當我與NullReferenceException以上註釋的代碼中斷「對象引用不設置爲一個對象的實例」。我不太確定我錯在哪裏。任何幫助將不勝感激。謝謝。

回答

1

數據庫節點沒有價值,只有屬性,如驅動程序,服務器,...

要檢索屬性值:

string driver = xmlNode.SelectSingleNode("database").Attributes["Name"] ; 
+0

正是我一直在尋找儘可能想知道一個標籤內的標籤被稱爲什麼。只有這個問題是你不能將字符串轉換爲你要調用'.Value'在該行的最後一個XMLAttribute。 – Cistoran

2

您可以使用Linq2Xml

var xDoc = XDocument.Load(filename); 
var dict = xDoc.Descendants("Database") 
      .First() 
      .Attributes() 
      .ToDictionary(x => x.Name, x => x.Value); 

如果希望值僅用於調試目的,

var str = string.Join("; ", xDoc.Descendants("Database") 
          .First() 
          .Attributes() 
          .Select(x => x.Name + "=" + x.Value)); 
0

看起來像是一個大寫問題,這是您的特定問題:(它是Xml中的「數據庫」和C#中的「數據庫」。)如前所述,LINQ to Xml也是最近的出路。

此外,如果您只是想要元素及其所有內容的原始文本表示,請考慮使用「OuterXml」屬性。