2015-09-22 243 views
0

我有一个数据对应于多个对象的XML文件。我正在尝试打开XML文件,循环查找特定的文件名并读取与此相关的所有值。如何读取特定的XML节点?

问题:

它永远不会有一个的XMLElement的名称和文件名之间的匹配。所以“我匹配当前打开的文件的名称”永远不会被打印。

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

此外,我想知道如何获得像不同的距离值一样的匹配,我怎样才能读取其他相应的值?

代码在我打开方法:

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> 
+0

你在节点列表中获得了什么? –

+0

我得到了不同的节点的列表,然后为每个节点读取“名称”。 – Naaz

+0

尝试在linq中找到答案。 – madan

回答

1

请按照以下方式使用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(); 
      } 

     } 
    } 
} 

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

+0

谢谢你,我正试图实现它,我只是想知道如何将距离值添加到新列表(忽略名称和距离列表)? – Naaz

+0

我明白你想要的距离列表值278和380 mathcing名称值。 ''''//结果是有值的字符串列表278和380 列表 distanceValues =新列表(); foreach(XElement item in xel.Ancestors(“Pattern”)。Descendants(“PatternDistance”)) { distanceValues.Add(item.Value); }' – John

+0

非常感谢!它的工作原理:D我认为我需要花时间阅读关于祖先和后代的整个树结构,以便正确理解它。 – Naaz

0
<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; 

确保文件名和节点[ “名称”]的innerText相同

+0

这似乎没有任何接近的答案! –

+0

@ Nikita-文件名返回完整路径并且带有扩展名的SafeFileName返回文件名称 – Rakesh

1

openFileDialog1.FileName返回文件的完整路径 使用openFileDialog1。 SafeFileName仅获取文件名,您将得到您想要的结果。字符串不计算,因为其中一个获取文件名,而另一个获取完整路径。使用openFileDialog1.SafeFileName,我相信你会得到一个匹配。

+0

说得对!这是我遇到的确切问题。谢谢:) – Naaz

1

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

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); 
} 

你可以得到PatternDistance名单像这样:

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

这可能有帮助!

+0

当我尝试执行代码的最后一位以将值存储到列表中时,它会给出错误消息: 错误无法隐式转换类型System.Collections.Generic.IEnumerable '到'bool' – Naaz

+0

没有布尔值。上述解决方案对我来说工作得很好。 –

+0

你有额外的代码吗? –