在C#中比较和匹配XML节点

时间:2012-11-04 20:48:05

标签: c# .net xml xml-parsing linq-to-xml

我正在尝试解析此XML文档并将guid与链接节点进行匹配。我有一个用C#构建的GUI,允许用户输入guid,我试图吐出与之对应的相应链接节点。

例如。用户输入ID:8385522,程序将吐出:

http://once.www.example.com

XML如下:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>
    </title>
    <link>
    </link>
    <description>
    </description>
    <language>
    </language>
    <lastBuildDate>
    </lastBuildDate>
    <item>
      <title>Parsing Example</title>
      <link>http://once.www.example.com</link>
      <pubDate>Sun, 16 Sep 2012 02:44:02 </pubDate>
      <guid>8385522</guid>
    </item>
    <item>
      <title>Parsing Example 2</title>
      <link>http://once.once.www.example2.com</link>
      <pubDate>Sat, 29 Sep 2012 18:29:13 </pubDate>
      <guid>8439191</guid>
    </item>
  </channel>
</rss>

我没有为输入ID的文本框编写任何代码。我在该字段中拥有的只有:

void TextBox1TextChanged(object sender, EventArgs e)
{

}

我是否需要将该功能放在文本框字段中?任何帮助表示赞赏。

编辑:这是我到目前为止所拥有的:

 private void button2_Click_1(object sender, EventArgs e)
        {
            Clipboard.Clear();


            if (Directory.Exists(@"c:\text"))    
            { 


            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(@"c:\text\text.xml");

            XmlDocument lDoc = new XmlDocument();
            lDoc.Load(@"c:\text\text.xml");



            XmlNodeList ctextbox = xDoc.GetElementsByTagName("guid");
            XmlNodeList link = lDoc.GetElementsByTagName("link");

我不确定解析函数的确切位置。

3 个答案:

答案 0 :(得分:1)

var links = from item in xdoc.Descendants("item")
            where (int)item.Element("guid") == yourGuid
            select (string)item.Element("link");

但是理解语法没有用于选择单个值的关键字,因此您需要links.SingleOrDefault();来获取链接。

或者您可以使用流畅的API进行搜索:

XDocument xdoc = XDocument.Load(@"c:\text\text.xml");
int guid = 8385522; // parse your guid from textbox

string link = xdoc.Descendants("item")
                  .Where(item => (int)item.Element("guid") == guid)
                  .Select(item => (string)item.Element("link"))
                  .SingleOrDefault();

如果可以搜索一些不在文件中的guid(看起来像你的情况,因为guid来自文本框),那么:

XDocument xdoc = XDocument.Load(@"c:\text\text.xml");
int guid = 8385525; // parse your guid from textbox

var links = from item in xdoc.Descendants("item")
            where (int)item.Element("guid") == guid
            select (string)item.Element("link");

string link = links.SingleOrDefault();

答案 1 :(得分:0)

string link = GetLink(@"c:\text\text.xml", "8385522");

-

string GetLink(string xmlFile,string guid)
{
    var xDoc = XDocument.Load(xmlFile);
    var item = xDoc.Descendants("item")
                    .FirstOrDefault(x => (string)x.Element("guid") == guid);

    if (item == null) return null;
    return (string)item.Element("link");
}

答案 2 :(得分:0)

我正在使用this xml library,但您可以使用.Net提供的XPath,包括System.Linq.XPath我相信。 (如果这是100%准确的话,我现在无法检查。)

XElement root = XElement.Load(file);
XElement guid = root.XPathElement("//guid[.={0}]", id);
XElement link = null;
if(null != guid)
    link = guid.Parent.Element("link");