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