【问题标题】:C# check if element exists in xml where attributeC# 检查元素是否存在于 xml where 属性中
【发布时间】:2016-08-22 23:23:47
【问题描述】:

如果某个元素的名称存在,我需要检查我的 XML 文档

channel-category 

其中元素属性等于某个id

channel id="X"

我有以下函数,但它总是返回 false,即使它确实存在

static bool exists(string channelname)
    {
        string path;
        string xmlfile = "\\xmlfile.xml";
        path = Environment.CurrentDirectory + xmlfile;
        XDocument xmlDoc = XDocument.Load(path);

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

这是我的xml的一个例子

<tv info="blahblah">
  <channel id="Channelname1">
    <display-name lang="en">Channelname1</display-name>
    <icon src="somelogo.png" />
    <url>http://somelink.com</url>
    <channel-category>SomeValue</channel-category>
  </channel>
  <channel id="Channelname2">
    <display-name lang="en">Channelname2</display-name>
    <icon src="somelogo.png" />
    <url>http://somelink.com</url>
   </channel>
</tv>

现在函数应该为 id Channelname1 返回 true,但为 id Channelname2 返回 false,但它只是为它们返回 false,我不知道为什么。有什么想法吗?

【问题讨论】:

    标签: c# sql xml function parsing


    【解决方案1】:

    我同意HaukurHaf,或者你也可以写简单的Linq语句,如下所示。

    static bool exists(string channelname) 
    {
        string path;
        string xmlfile = "\\xmlfile.xml";
        path = Environment.CurrentDirectory + xmlfile;
        XmlDocument doc = XmlDocument.Load(path);
    
         return (doc.Descendants("channel").Any(x => (string) x.Attribute("id") == channelname && x.Element("channel-category") != null);
    }
    

    试试这个工作Demo

    【讨论】:

      【解决方案2】:

      你必须使用 XDocument 和 Linq2Xml 吗? 使用 XmlDocument 类和 XPath 怎么样?

      static bool exists(string channelname)
          {
              string path;
              string xmlfile = "\\xmlfile.xml";
              path = Environment.CurrentDirectory + xmlfile;
              XmlDocument doc = XmlDocument.Load(path);
      
              return doc.SelectSingleNode("//tv/channel[@id=" + channelname + "]/channel-category") != null;
          }
      

      【讨论】:

      • 感谢您的回复!不幸的是,它仍然返回错误。 if (exists(allchannels)) { Console.WriteLine("already exists!"); } else 函数返回 false 并命中 else string.Concat returned "//tv/channel[@id=Channelname1]/channel-category" string System.Xml.XmlNode.SelectSingleNode returned null System.Xml.XmlNode channelname "Channelname1" string
      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多