如何读取特定的XML节点

本文关键字:XML 节点 何读取 读取 | 更新日期: 2023-09-27 18:13:55

我有一个XML文件,其中包含与多个对象相对应的数据。我正在尝试打开XML文件,循环查找特定的文件名,并读取与之相关的所有值。

问题:

XMLElement的名称和文件名之间从来没有匹配。因此,"我匹配当前打开的文件名"永远不会打印出来。

我想要的是:因此,当用户在OpenFileDialog中打开"dog.jpg"时,XML文档就会加载,它应该能够找到值为dog.jpg的XML元素"Name",并打印"我匹配当前打开的文件名"。

此外,我想知道一旦我得到了像不同距离值这样的匹配,我如何读取其他相应的值

我的Open方法中的代码:

string fileName = openFileDialog1.FileName; //file name of a JPEG file opened by a user
XmlDocument doc = new XmlDocument();
doc.Load(@"C:'Users'Desktop'TangramsTool'patterndata.xml");
XmlNodeList nodeList = doc.SelectNodes("/Patterns/Pattern");
foreach (XmlNode node in nodeList)
    {
         string text = node["Name"].InnerText; //or loop through its children as well
         if (text.Equals(fileName))
         {
              Console.WriteLine("I match the currently open file's name: " + text);
         }
         else
         {
              Console.WriteLine("This node's name is : " + text);
         }
    }

我的XML文件:

<Patterns>
     <Pattern> 
         <Name>dog.jpg</Name> 
         <PatternDistancesList>       
              <PatternDistance>278</PatternDistance>
              <PatternDistance>380</PatternDistance>
         </PatternDistancesList> 
     <Pattern/>
     <Pattern> 
          <Name>cat.jpg</Name> 
          <PatternDistancesList>       
              <PatternDistance>278</PatternDistance>
              <PatternDistance>380</PatternDistance>
          </PatternDistancesList> 
     <Pattern/>
</Patterns>

如何读取特定的XML节点

使用Linq尝试以下方法。答案还包括您的以下问题。

此外,我想知道一旦我得到了像不同距离值这样的匹配,我如何读取其他相应的值?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string uploadFilename = "dog.jpg";
            XDocument xdoc = XDocument.Load(@"C:'Users'admin'XMLFile1.xml");
            //// check if the xml file is having node mathcing upload filename name 
            List<XElement> xel = xdoc.Descendants("Name").Where(x => x.Value == uploadFilename).ToList();
            if (xel.Any())
            {
                Console.WriteLine("I match the currently open file's name: " + uploadFilename);
                //// Get list of element list's Ancestors
                //// will return
                ////<Name>dog.jpg</Name>
                ////<PatternDistancesList>
                ////  <PatternDistance>278</PatternDistance>
                ////  <PatternDistance>380</PatternDistance>
                ////</PatternDistancesList>
                //// looop through it
                foreach (XElement item in xel.Ancestors("Pattern").Elements().ToList())
                {
                }
                //// OR get another list
                List<XElement> foundItems = xel.Ancestors("Pattern").Elements().ToList();
            }
        }
    }
}

这是使用控制台应用程序的基本帮助。相应地修改代码。希望能有所帮助。:(

openFileDialog1.FileName返回文件的完整路径使用openFileDialog1.SafeFileName只获取文件名,您就会得到所需的结果。这些字符串无法计算,因为其中一个字符串获取文件名,而另一个字符串则获取完整路径。使用openFileDialog1.SafeFileName,我相信你会得到一个匹配。

从文件对话框中获取文件名:

string fileName = openFileDialog1.SafeFileName;

加载XmlDocument:

XDocument xdoc = XDocument.Load(@"C:'Users'Desktop'TangramsTool'patterndata.xml");

获取匹配的XElements:

var MatchingPatterns=xdoc.Elements("Pattern").Where(o=>o.Element(Name).Value.Trim()==filename).FirstOrDefault();
if(MatchingPatterns!=null)
{
 Console.WriteLine("I match the currently open file's name: " + fileName );
}

你可以得到这样的模式显示列表:

   List<XElement> patternDistances= MatchingPatterns.Element("PatternDistancesList").Elements("PatternDistance").ToList();

这可能会有所帮助!

<Patterns>
     <Pattern> 
         <Name>dog.jpg</Name> 
         <PatternDistancesList>       
              <PatternDistance>278</PatternDistance>
              <PatternDistance>380</PatternDistance>
         </PatternDistancesList> 
     </Pattern>
     <Pattern> 
          <Name>cat.jpg</Name> 
          <PatternDistancesList>       
              <PatternDistance>278</PatternDistance>
              <PatternDistance>380</PatternDistance>
          </PatternDistancesList> 
     </Pattern>
</Patterns>
string fileName = openFileDialog1.SafeFileName;

确保文件名和节点["Name"]。InnerText是相同的