2012-04-13 8 views
1

Ich würde gerne wissen, wie Sie eine Zeichenfolge in XML-Datei finden.Suchen Sie eine Zeichenfolge in XML

sagen, das ist die XML-Datei i haben (diese sind die SQL-Server-Instanzen btw, irrelevant)

<?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> 

Also, was passiert ist, ich eine Zeichenfolge vom Benutzer in einem beliebigen Format zum Beispiel sagen, bekommen nur ich bekommen Instanz und dann möchte ich die Listbox alle Servernamen anzuzeigen, die mit dem Server im obigen Fall beginnt es

instance1 \ server1
instance2 \ serve2

und so weiter .. Nicht sicher, wie dies zu erreichen ist, muss ich Stream-Reader öffnen oder nur eine Zeichenfolge und Browser durch die XML-Datei erhalten?

AKTUALISIERT

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(); 
} 

ich einfach bin immer diese in das Textfeld ein: System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement, System.String]

enter image description here

starken Text UPDATE2

.cs-Dateicode

private void button1_Click (Objektabsender, 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 sieht wie folgt aus

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

enter image description here

+0

Sie benötigen ein XDocument zu verwenden, nicht ein XPathDocument. Siehe aktualisierte Antwort unten. – Robaticus

+0

enumerieren auf 'Ergebnisse' für zB.,' String.Join ("\ n", Ergebnisse) ' –

+0

nichts wird angezeigt, wenn Sie den Code ändern. listBox1.Items.Add (String.Join ("\ n", Ergebnisse)); textBox1.Text = String.Join ("\ n", Ergebnisse); – JackyBoi

Antwort

4

Sie so etwas tun könnte, vorausgesetzt, Sie die XML in ein XDocument laden.

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); 

Bearbeiten - WPF Beispiel

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 Beispiel ohne Datacontext. Vielleicht möchten Sie sich über den MVVM-Ansatz informieren, da dieser zum Standard für die WPF-Entwicklung wird. Benutze das in der Zwischenzeit.

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

Ich bekomme Fehler bei der oben genannten (meine Frage aktualisiert mit Code) – JackyBoi

+0

Bitte sehen Sie den upgedated Code – JackyBoi

+0

Ich habe das gleiche wie Sie sagte, ich habe sogar aktualisiert, aber nicht sicher, warum es funktioniert nicht, muss ich noch etwas tun? – JackyBoi

1

Sie können XmlDocument verwenden wie folgt aus:

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

pls sehe meinen aktualisierten Code sehen Ihre – JackyBoi

+0

ok eigentlich ich nur möchte die übereinstimmenden Elemente in der Listbox anzeigen, anstatt die Textbox, die viel besser ist..tks – JackyBoi

Verwandte Themen