c添加xml元素,其中attribute等于

本文关键字:其中 attribute 等于 元素 添加 xml | 更新日期: 2023-09-27 18:03:18

我有一个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 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>

c添加xml元素,其中attribute等于

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);
    }
}
    bool doesexists = (from data in xmlDoc.Element("tv").Elements("channel")
                   where (string)data.Attribute("id") == channelname
                   select data).Any();

您正在尝试到达channel节点,其中id等于tv内的通道名称。问题是tv不存在,通道在这个里面:

<list info="list">

解决方案:将通道放入tv,或者使用适合您当前结构的选择器。

为什么使用tv而不是list,这就是为什么xml库无法获取元素的路径并引发此错误的原因。

试试这个。。

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