2016-08-22 1 views
0

Ich habe eine XML-Datei, die eine Reihe von Kanälen hat, und ich möchte eine Kanalkategorie an jede einzelne von ihnen anhängen. Abhängig davon, welcher Kanal es ist. Ich bin sehr neu, also entschuldigen Sie bitte, wenn das ein offensichtlicher Fehler ist.C# Hinzufügen von XML-Element, wo Attribut gleich

Beispiel:

<channel-category>Entertainment</channel-category> 

oder

<channel-category>News</channel-category> 

Ich habe versucht, die folgenden:

 string path; 
     string xmlfile = "/channels.xml"; 
     path = Environment.CurrentDirectory + xmlfile; 

     if (exists("channelname1")) 
     { 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(path); 
      XmlNode root = doc.DocumentElement; 
      XmlNode node = root.SelectSingleNode("list/channel[@id='channelname1'"); 
      XmlNode category = doc.CreateElement("channel-category"); 
      category.InnerText = "channelcataegorygoeshere"; 
      node.AppendChild(category); 
      doc.DocumentElement.AppendChild(node); 
     } 
     else 
     { 
      Console.WriteLine("not found"); 
     } 
     Console.ReadKey(); 
    } 
    static bool exists(string channelname) 
    { 
     string path; 
     string xmlfile = "/channels.xml"; 
     path = Environment.CurrentDirectory + xmlfile; 
     XDocument xmlDoc = XDocument.Load(path); 

     bool doesexists = (from data in xmlDoc.Element("list").Elements("channel") 
         where (string)data.Attribute("id") == channelname 
         select data).Any(); 
     return doesexists; 
    } 

aber es gibt mir die folgende Fehlermeldung und ich kann es nicht herausgefunden. . Was mache ich falsch?

An unhandled exception of type 'System.Xml.XPath.XPathException' occurred in System.Xml.dll 
    Additional information: 'list/channel[@id='channelname1'' has an invalid token. 

von dieser Linie

XmlNode node = root.SelectSingleNode("list/channel[@id='channelname1'"); 

Meine XML-ähnliche

<?xml version="1.0" encoding="UTF-8"?> 
<list info="list"> 
    <channel id="channelname1"> 
    <display-name lang="en">channelname1</display-name> 
    <icon src="http://locationtologo.com/" /> 
    <url>http://someurl.com</url> 
    </channel> 
    <channel id="channelname2"> 
    <display-name lang="en">channelname2</display-name> 
    <icon src="http://locationtologo.com/" /> 
    <url>http://someurl.com</url> 
    </channel> 
    <channel id="channelname3"> 
    <display-name lang="en">channelname3</display-name> 
    <icon src="http://locationtologo.com/" /> 
    <url>http://someurl.com</url> 
    </channel> 
    <channel id="channelname4"> 
    <display-name lang="en">channelname4</display-name> 
    <icon src="http://locationtologo.com/" /> 
    <url>http://someurl.com</url> 
    </channel> 
</list> 
+1

'von Daten in xmlDoc.Element ("tv")' - Ihre xml haben nicht 'tv' Element. –

+0

Entschuldigung, ich habe den falschen Fehler eingefügt. 'Eine nicht behandelte Ausnahme des Typs 'System.Xml.XPath.XPathException' aufgetreten in System.Xml.dll Zusätzliche Informationen: Liste/Kanal [@ id = 'channelname1 '' hat eine ungültige token.' aus Diese Zeile: 'XmlNode Knoten = root.SelectSingleNode (" list/channel [@ id = 'Kanalname1' ");' Ich habe meinen Beitrag bearbeitet. –

Antwort

1

Sie haben keine schließende Klammer in list/channel[@id='channelname1'(HERE).

Außerdem Sie versuchen tatsächlich folgendes zu tun:

var doc = new XmlDocument(); 
doc.Load(Environment.CurrentDirectory + "\\channels.xml"); 
var nodes = doc.SelectNodes("list/channel[@id=\"channelname1\"]"); 
if (nodes != null) 
{ 
    foreach (XmlNode node in nodes) 
    { 
     var el = doc.CreateElement("channel-category"); 
     el.InnerText = "SomeValue"; 
     node.AppendChild(el); 
    } 
} 
+0

oh ich sehe ... Ich habe es völlig falsch gemacht .. Ich habe versucht, was Sie gesagt haben, und während es keine Fehler gibt es nicht speichern das neue angefügte Element in der XML-Datei. Ich habe es durchgesehen und sehe es anhängen, aber wenn ich in die XML-Datei gehe, wurde nichts geändert. irgendwelche Gedanken? –

+0

den vorherigen Kommentar ignorieren. Ich habe doc.save vergessen. Es klappt!! ich danke dir sehr!!!! –

0

sieht Warum Sie tv statt Liste verwenden ist, warum nicht xml Bibliothek Ihren Weg Ihrer Elemente und werfen immer dieser Fehler.

versuchen, dies ..

XmlNode node = root.SelectSingleNode("list/channel"); 
node.Attributes["id"].Value=="channelname1"?true:false; 
+0

Entschuldigung, ich habe den falschen Fehler eingefügt. 'Eine nicht behandelte Ausnahme des Typs 'System.Xml.XPath.XPathException' aufgetreten in System.Xml.dll Zusätzliche Informationen: Liste/Kanal [@ id = 'channelname1 '' hat eine ungültige token.' aus diese Zeile: 'XmlNode Knoten = root.SelectSingleNode ("list/channel [@ id = 'channelname1'"); ' Ich habe meinen Beitrag bearbeitet. –

+0

@RangaSarin versuchen Sie diese bearbeitete, die Sie weiter in eine Schleife setzen können – Abhay

+0

Ich habe es funktioniert mit Paweł Dyls Methode. Vielen Dank für all Ihre Zeit und Hilfe, obwohl es geschätzt wird! –

0
bool doesexists = (from data in xmlDoc.Element("tv").Elements("channel") 
        where (string)data.Attribute("id") == channelname 
        select data).Any(); 

Sie versuchen die channel Knoten zu erreichen, wo die id die channel innen tv entspricht. Das Problem ist, dass tv nicht vorhanden ist, sind die Kanäle im Inneren dieses:

<list info="list"> 

Lösung: entweder stellen die Kanäle in tv oder einen Selektor entsprechend Ihrer aktuellen Struktur.

+0

Entschuldigung, es war ein Fehler beim Einfügen. Ich habe meinen ursprünglichen Beitrag mit dem korrekten Fehler und Code aktualisiert. Selbst wenn Sie die Liste verwenden, wird immer noch der gleiche Fehler ausgegeben. –

Verwandte Themen