2012-04-13 60 views
1

我想知道如何在XML文件中查找字符串。在XML中查找字符串

說這是XML文件,我有(這是SQL Server實例順便說一句,不相關)

<?xml version="1.0" encoding="utf-8" ?> 
<Servernames> 
    <loc country="Lockheed"> 
     <Servername>instance1\server1</Servername> 
     <Servername>instance2\server2</Servername> 
     <Servername>10.90</Servername> 
    </loc> 
    <loc country="SouthAmerica"> 
     <Servername>Hide your heart</Servername> 
     <Servername>Bonnie Tyler</Servername> 
     <Servername>10.0</Servername> 
    </loc> 
    <loc country="Britian"> 
     <Servername>Greatest\Hits</Servername> 
     <Servername>Dolly\Parton</Servername> 
     <Servername>this\is</Servername> 
    </loc> 
</Servernames> 

所以會發生什麼是我得到任何格式的用戶的字符串,例如說我只得到實例,然後我想在列表框中顯示所有以在上述情況下服務器啓動servernames節點將是

INSTANCE1 \ server1的
INSTANCE2 \ serve2

等.. 不知道如何實現這一點,我必須打開流讀取器或只是得到一個字符串和瀏覽器通過XML文件?

修訂

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    textBox1.Clear(); 
    string fileName = "c:\\users\\xxxx\\documents\\visual studio 2010\\Projects\\WpfApplication2\\WpfApplication2\\XML.xml"; 

     var doc = XDocument.Load(fileName); 
     var findString = "Server"; 

     var results = doc.Element("Servernames").Descendants("Servername").Where(d => d.Value.Contains(findString)).Select(d => d.Value); 
     listBox1.Items.Add(results.ToString()); 
     textBox1.Text = results.ToString(); 
} 

我只是在文本框中得到這個:System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement,System.String]

enter image description here

強大的文本 UPDATE2

.cs文件代碼

private void button1_Click(object sender,RoutedEventArgs e) { textBox1.Clear();

 string fileName = "c:\\users\\xxxxx\\documents\\visual studio 2010\\Projects\\WpfApplication2\\WpfApplication2\\XML.xml"; 

     var doc = XDocument.Load(fileName); 
     var findString = "Server"; 

     var results = doc.Element("Servernames").Descendants("Servername").Where(d => d.Value.Contains(findString)).Select(d => d.Value); 

     Servers = new ObservableCollection<string>(results); 

     MessageBox.Show("THis is loaded"); 

    } 

XAML看起來像這樣

<ListBox Height="200" HorizontalAlignment="Left" Margin="200,44,0,0" x:Name="ListBox1" VerticalAlignment="Top" Width="237"> 

enter image description here

+0

您需要使用一個XDocument,而不是一個XPathDocument中。見下面更新的答案。 – Robaticus 2012-04-13 04:17:28

+0

枚舉''結果'前例,'String.Join(「\ n」,結果)' – 2012-04-13 06:11:43

+0

如果將代碼更改爲此,則不顯示任何內容。 listBox1.Items.Add(String.Join(「\ n」,results)); textBox1.Text = String.Join(「\ n」,results); – JackyBoi 2012-04-13 06:36:58

回答

4

你可以做這樣的事情,假設你的XML加載到一個XDocument。

string fileName = "c:\\users\\xxxxx\\documents\\visual studio 2010\\Projects\\WpfApplication2\\WpfApplication2\\XML.xml"; 

var doc = XDocument.Load(fileName); 
var findString = "server"; 

var results = doc.Element("Servernames").Descendants("Servername").Where (d => d.Value.Contains(findString)).Select (d => d.Value); 

編輯 - WPF例

XAML:

<ListBox ItemSource="{Binding Servers}"/> 

的DataContext:

public ObservableCollection<string> Servers {get; set;} 

string fileName = "c:\\users\\xxxxx\\documents\\visual studio 2010\\Projects\\WpfApplication2\\WpfApplication2\\XML.xml"; 

var doc = XDocument.Load(fileName); 
var findString = "server"; 

var results = doc.Element("Servernames").Descendants("Servername").Where (d => d.Value.Contains(findString)).Select (d => d.Value); 

Servers = new ObservableCollection<string>(results); 

EDIT2 - WPF實施例而不的datacontext。您可能需要閱讀MVVM方法,因爲它正在成爲WPF開發的標準。在此期間使用它。

XAML:

<ListBox x:Name="ListBox1" /> 

的DataContext:

string fileName = "c:\\users\\xxxxx\\documents\\visual studio 2010\\Projects\\WpfApplication2\\WpfApplication2\\XML.xml"; 

var doc = XDocument.Load(fileName); 
var findString = "server"; 

var results = doc.Element("Servernames").Descendants("Servername").Where (d => d.Value.Contains(findString)).Select (d => d.Value); 

foreach(string result in results) 
{ 
    ListBox1.Items.Add(result); 
} 
+0

我得到上述錯誤(我的問題更新代碼) – JackyBoi 2012-04-13 03:52:35

+0

請參閱上升代碼 – JackyBoi 2012-04-13 05:05:08

+0

我做了同樣的你說我甚至更新,但不知道爲什麼它不工作還有什麼我需要做的? – JackyBoi 2012-04-13 10:03:12

1

您可以使用XmlDocument的是這樣的:

string xml = "<your xml>"; 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 
foreach (XmlNode xmlLoc in doc.DocumentElement.SelectNodes("loc")) 
{ 
    foreach (XmlNode xmlServername in xmlLoc.SelectNodes("Servername")) 
    { 
     Debug.WriteLine(string.Format("Servername={0}", xmlServername.InnerText)); 
     // xmlServername.InnerText will be \instance1\server1, etc. 
     // UPDATE: add item to listbox 
     listBox1.Items.Add(xmlServername.InnerText); 
    } 
} 
+0

請參閱我的更新代碼看到你的 – JackyBoi 2012-04-13 06:40:28

+0

確定其實我只是想要在列表框中顯示匹配的項目,而不是更好的文本框..tks – JackyBoi 2012-04-13 13:32:03