如何在xml中查找已存在的值

时间:2014-01-04 08:14:48

标签: c# xml

大家好我想使用xml将一个c#数据更新为另一个xml。为此我首先要检查另一个xml中是否存在protected void CheckUpdates() { XmlDataDocument xmldoc = new XmlDataDocument(); XmlNodeList xmlnode; int i = 0; string str = null; FileStream fs = new FileStream("..\\xml\\listUpdates.xml", FileMode.Open, FileAccess.Read); xmldoc.Load(fs); xmlnode = xmldoc.GetElementsByTagName("lst"); for (i = 0; i <= xmlnode.Count - 1; i++) { xmlnode[i].ChildNodes.Item(0).InnerText.Trim(); str = xmlnode[i].ChildNodes.Item(0).InnerText.Trim() ; } } 数据。我坚持使用此代码请帮助我如何完成此操作?这是我的代码

<?xml version="1.0" encoding="utf-8" ?>
<blocker>
  <lst>Download</lst>
  <lst>Downloader</lst>
  <lst>Downloader</lst>
  <lst>Downloader</lst>
  <lst>video</lst>
  <lst>video</lst>
</blocker>

示例XML:

{{1}}

在这段代码中我首先从新的xml中检索数据,现在我想检查我的旧xml,如果值已经存在或者不存在那么我将更新它请告诉我接下来要做什么 感谢

2 个答案:

答案 0 :(得分:0)

您希望解析新的XML文件,并在lst元素中添加尚未包含在现有XML文件中的任何值。这是代码:

var originalXmlDoc = XDocument.Load(originalFilename); var newXmlDoc = XDocument.Load(newFilename);

foreach (var newElement in newXmlDoc.Element("blocker").Elements("lst"))
{
    newElement.Value.Trim().Dump();
    if (!originalXmlDoc.Element("blocker").Elements("lst")
                  .Any(oldElement => oldElement.Value.Trim().Equals(
                      newElement.Value.Trim(), 
                      StringComparison.InvariantCultureIgnoreCase)))
    {
        originalXmlDoc.Element("blocker").Add(new XElement("lst", newElement.Value));
    }
}
originalXmlDoc.Save(originalFilename, SaveOptions.None);

您可以使用以下2个XML文件进行试用:

原始XML:

<?xml version="1.0" encoding="utf-8" ?>
<blocker>
  <lst>Downloader</lst>
</blocker>

新XML:

<?xml version="1.0" encoding="utf-8" ?>
<blocker>
  <lst>Download</lst>
  <lst>Downloader</lst>
  <lst>Downloader</lst>
  <lst>Downloader</lst>
  <lst>video</lst>
  <lst>video</lst>
</blocker>

产生的XML:

<?xml version="1.0" encoding="utf-8" ?>
<blocker>
  <lst>Downloader</lst>
  <lst>Download</lst>
  <lst>video</lst>
</blocker>

希望有所帮助。

答案 1 :(得分:0)

您可以使用XmlDocument执行此操作:

static void Main(string[] args)
{
    HashSet<string> set = new HashSet<string>();
    XmlDocument doc = new XmlDocument();
    doc.Load("original.xml");

    XmlDocument doc2 = new XmlDocument();
    doc2.Load("update.xml");

    var nodesoriginal = doc.SelectNodes("/blocker/lst");
    var nodesupdate = doc2.SelectNodes("/blocker/lst");

    var List = nodesoriginal.Cast<XmlNode>().Concat<XmlNode>(nodesupdate.Cast<XmlNode>());

    foreach (XmlNode element in List)
    {
        string value = element.InnerText;
        if (value != null && !set.Contains(value))
        {
            set.Add(value);
        }
    }

    XmlDocument output = new XmlDocument();
    XmlElement blocker = output.CreateElement("blocker");
    foreach(var str in set)
    {
        XmlElement node = output.CreateElement("lst");
        node.InnerText = str;
        blocker.AppendChild(node);
    }

    output.AppendChild(blocker);

    output.Save("output.xml");
    output.Save(Console.Out);
    Console.ReadKey();
}

original.xml:

<?xml version="1.0" encoding="utf-8" ?>
<blocker>
<lst>Original1</lst>
</blocker>

update.xml:

<?xml version="1.0" encoding="utf-8" ?>
<blocker>
 <lst>Download</lst>
 <lst>Downloader</lst>
 <lst>Downloader</lst>
 <lst>Downloader</lst>
 <lst>video</lst>
 <lst>video</lst>
</blocker>

输出xml:

<?xml version="1.0" encoding="ibm852"?>
<blocker>
  <lst>Original1</lst>
  <lst>Download</lst>
  <lst>Downloader</lst>
  <lst>video</lst>
</blocker>