2012-04-13 61 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