【问题标题】:Comparing and matching XML nodes in C#在 C# 中比较和匹配 XML 节点
【发布时间】:2012-10-24 17:40:12
【问题描述】:

我正在尝试解析此 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");

我不确定解析函数需要放在哪里。

【问题讨论】:

  • 顺便说一句,写下你尝试过的东西很好。

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


【解决方案1】:
var links = from item in xdoc.Descendants("item")
            where (int)item.Element("guid") == yourGuid
            select (string)item.Element("link");

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

或者您可以使用 fluent 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();

【讨论】:

    【解决方案2】:
    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");
    }
    

    【讨论】:

      【解决方案3】:

      我使用的是this xml library,但我相信您可以通过包含System.Linq.XPath 来使用.Net 提供的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");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多