【问题标题】:Selecting value from first xml child node从第一个 xml 子节点中选择值
【发布时间】:2015-07-16 03:23:55
【问题描述】:

我有一个 XML 文件,其中包含用于不同图像文件大小的多个 URL,我正在尝试将单个 URL 加载到图片框中。我的问题是子节点的命名相似,父节点的命名也相似。例如,我想拉取第一个中型图像(以SL160_.jpg 结尾)。 XML 代码见下文

<Items>
<SmallImage>
    <URL>http://ecx.images-amazon.com/images/I/51TAL%2Bn7AqL._SL75_.jpg</URL>
</SmallImage>
<MediumImage>
    <URL>http://ecx.images-amazon.com/images/I/51TAL%2Bn7AqL._SL160_.jpg</URL>
</MediumImage>
<LargeImage>
    <URL>http://ecx.images-amazon.com/images/I/51TAL%2Bn7AqL.jpg</URL> 
</LargeImage>
<MediumImage>
    <URL>http://ecx.images-amazon.com/images/I/51TAL%2Bn7AqL._SL162_.jpg</URL> 
</MediumImage>
<LargeImage>
    <URL>http://ecx.images-amazon.com/images/I/51TAL%2Bn7AqL.jpg</URL> 
</LargeImage>
</Items>

我尝试过使用GetElementsByTag,以及尝试调用doc.SelectSingleNode("LargeImage").SelectSingleNode("URL").InnerTextGetElementByID 之类的名称。所有这些都给了我一个Object set to null reference 异常。

我可以做些什么来指定我想要来自第一个找到的 MediumImage 节点的 url?

【问题讨论】:

  • 请发布minimal but complete 示例来说明问题。没有那个我只能猜测,也许:doc.SelectSingleNode("//MediumImage/URL").InnerText
  • 您的代码显示"LargeImage",但问题的最后一句要求MediumImage 节点?
  • 我正在尝试非此即彼,但不小心离开了 LargeImage 而不是 MediumImage - 我会确保在将来发布一个完整的示例,但我已经尝试过诸如doc.SelectSingleNode("//LargeImage/URL").InnerTextdoc.SelectSingleNode("/LargeImage/URL").InnerTextdoc.SelectSingleNode("LargeImage/URL").InnerText 等。我将在下面尝试 SkyFangs 的答案,我会告诉你情况如何!
  • 我怀疑你的 XML 有默认命名空间(类似于xmlns="..."),不是吗?
  • 是的,我删除了所有多余的部分以获得最小化的 XML 代码,因为原始代码有几百行。

标签: c# xml


【解决方案1】:

使用LinqToXML,比较简单

string xml = @"<Items>
<SmallImage>
<URL>http://ecx.images-amazon.com/images/I/51TAL%2Bn7AqL._SL75_.jpg</URL>
</SmallImage>
<MediumImage>
<URL>http://ecx.images-amazon.com/images/I/51TAL%2Bn7AqL.01_SL160_.jpg</URL>
</MediumImage>
<LargeImage>
<URL>http://ecx.images-amazon.com/images/I/51TAL%2Bn7AqL.jpg</URL> 
</LargeImage>
<MediumImage>
<URL>http://ecx.images-amazon.com/images/I/51TAL%2Bn7AqL.02_SL162_.jpg</URL> 
</MediumImage>
<LargeImage>
<URL>http://ecx.images-amazon.com/images/I/51TAL%2Bn7AqL.jpg</URL> 
</LargeImage>
</Items>";
XElement root = XElement.Parse(xml);
var ele = root.Elements("MediumImage").Where(e => e.Element("URL").Value.EndsWith("SL160_.jpg")).FirstOrDefault();
Console.WriteLine(ele);

【讨论】:

  • 如果结局不重要怎么办?它可以以任何形式结束,所以我只寻找名为MediumImage 的第一个元素下的URL——有没有像root.Elements("MediumImage").Element("URL").Value.FirstOrDefault(); 这样的东西可以用来访问它?
  • 请原谅我的英语不好,但是ele已经是你想要的MediumImage节点,你只需要检查它是否为null,如果不是null,你可以使用ele.Element("URL").Value获取网址
  • 如果你不知道你想要什么类型的图片,你只知道结尾是什么,你也可以用root.Elements()代替root.Elements("MediumImage")
【解决方案2】:

除了Sky Fang的回答,我认为OP想要这个:

var firstMedImg = root.Elements("MediumImage").First();
var imgUrl = firstMedImg.Element("URL").Value;

【讨论】:

    【解决方案3】:
            XmlDocument doc = new XmlDocument();
    
            // PATH TO YOUR DOCUMENT
            doc.Load("daco.xml");
    
            // Select LIST ALL ELEMENTS SmallImage,MediumImage,LargeImage
            XmlNodeList listOfAllImageElements = doc.SelectNodes("/Items/*");
    
            foreach (XmlNode imageElement in listOfAllImageElements)
            {
                // Select URL ELEMENT
                XmlNode urlElement= node.SelectSingleNode("URL");
                System.Console.WriteLine(urlElement.InnerText);
            }
    
            Console.ReadLine();
    

    如果你想选择多个 url 的

            XmlDocument doc = new XmlDocument();
    
            // PATH TO YOUR DOCUMENT
            doc.Load("daco.xml");
    
            // Select LIST ALL ELEMENTS SmallImage,MediumImage,LargeImage
            XmlNodeList listOfAllImageElements = doc.SelectNodes("/Items/*");
    
            foreach (XmlNode imageElement in listOfAllImageElements)
            {
                // Select URL's ELEMENTs
                XmlNodeList listOfAllUrlElements = imageElement.SelectNodes("URL");
                foreach (XmlNode urlElement in listOfAllUrlElements)
                {
                    System.Console.WriteLine(urlElement.InnerText);
                }
            }
    
            Console.ReadLine();
    

    如果您的 xml 文件中有特定的命名空间

            XmlDocument doc = new XmlDocument();
            doc.Load("doc.xml");
    
            XmlNamespaceManager man = new XmlNamespaceManager(doc.NameTable);
            // reaplace http://schemas.microsoft.com/vs/2009/dgml with your namespace
            man.AddNamespace("x", "http://schemas.microsoft.com/vs/2009/dgml");
    
            // next you have to use x: in your path like this 
            XmlNodeList node = doc.SelectNodes("/x:Items/x:*, man);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2022-08-05
      相关资源
      最近更新 更多