2016-08-22 8 views
0

)xmlファイルには複数のチャネルがあり、それらのすべてのチャネルカテゴリにチャネルカテゴリを追加します。どのチャンネルに依存するか。私はこれに非常に新しいですので、これが明らかな誤りであれば私には容赦してください。c#xml要素を追加します(属性が

例:私は、次の試してみました

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

または

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

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

が、それは私に次のエラーを与えていると私はそれを把握することはできません。私は間違って何をしていますか?

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

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

私のXMLは、XMLライブラリがあなたの要素と投げるのパスを取得しない理由thatsのリストの代わりにテレビを使用しているのはなぜこの

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

'xmlDoc.Element( "TV")のデータから、' - あなたのXMLは 'tv'要素を持っていません。 –

+0

申し訳ありませんが、間違ったエラーを貼り付けました。 '型 'System.Xml.XPath.XPathException' の未処理の例外は、System.Xml.dllに 発生しました追加情報: 'リスト/チャンネルを[ID @ =' channelname1は '' から token.'無効ありこの行は 'XmlNode node = root.SelectSingleNode(" list/channel [@ id = 'channelname1' "];' 私の投稿を編集しました。 –

答えて

1

閉じ括弧list/channel[@id='channelname1'(HERE)にありません。

また、あなたが実際に次の操作を行うにしようとしている。

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

ああ私が見ている...私は完全に間違っていた。あなたが言ったことを試したが、何のエラーも与えていないが、XMLファイルに新しい追加要素を実際に保存していない。私はそれを突き抜けて、それが追加されるのを見ることができますが、私がxmlファイルに入ると、何も変更されませんでした。何かご意見は? –

+0

その前のコメントを無視します。私はdoc.saveを忘れました。できます!!どうもありがとうございます!!!! –

0

のように見えますこのエラー。

はこれを試してください。..

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

申し訳ありませんが、間違ったエラーを貼り付けました。 '型 'System.Xml.XPath.XPathException' の未処理の例外は、System.Xml.dllに 発生しました追加情報: 'リスト/チャンネルを[ID @ =' channelname1は '' から token.'無効ありこの行は 'XmlNode node = root。SelectSingleNode( "list/channel [@ id = 'channelname1'"]; ' 私の投稿を編集しました。 –

+0

@RangaSarinこれをさらに編集してみてください。 – Abhay

+0

PawełDylのメソッドを使って作業しています。それは感謝していますが、あなたのすべての時間のためにありがとう、ありがとう! –

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

あなたはidtv内CHANNELNAMEに等しいchannelノードに到達しようとしています。問題はtvが存在しないということである、チャネルがこの内側にある:

<list info="list"> 

解決策:tvにチャンネルを置く、またはあなたの現在の構造に適切なセレクタを使用しますか。

+0

申し訳ありませんが、それはペーストエラーでした。正しいエラーとコードで元の投稿を更新しました。リストを使用しても同じエラーがスローされます。 –

関連する問題