Найти строку в XML
Я хотел бы знать, как найти строку в файле XML.
Скажи, что это XML-файл, который у меня есть (это экземпляры SQL-сервера, кстати, не имеет значения)
<?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>
Итак, что происходит, я получаю строку от пользователя в любом формате, скажем, например, я получаю только экземпляр, а затем я хочу, чтобы в списке отображались все имена серверов, начинающиеся с сервера, в приведенном выше случае это будет
instance1\ сервер1
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]
сильный текст ОБНОВЛЕНИЕ2
Код файла.cs
private void button1_Click(отправитель объекта, 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">
2 ответа
Вы можете сделать что-то вроде этого, предполагая, что вы загружаете 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);
}
Вы можете использовать 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);
}
}