如果为空值,则XPath显示null

时间:2015-06-01 22:29:39

标签: xml xpath

如果我们有这个XML文件,我们如何使用XPath在一个对象中选择几个项目?

<CATALOG>
   <CD>
      <TITLE>Empire Burlesque</TITLE>
      <ARTIST>Bob Dylan</ARTIST>
      <COUNTRY>USA</COUNTRY>
      <PRICE>10.90</PRICE>
      <YEAR>1985</YEAR>
   </CD>
   <CD>
      <TITLE>Hide your heart</TITLE>
      <ARTIST>Bonnie Tyler</ARTIST>
   </CD>
   <CD>
      <TITLE>Greatest Hits</TITLE>
      <COMPANY>RCA</COMPANY>
      <PRICE>9.90</PRICE>
      <YEAR>1982</YEAR>
   </CD>
</CATALOG>

所需的对象应该有:

myObj[0].TITLE = "Empire Burlesque"; 
myObj[0].ARTIST = "Bob Dylan";
myObj[0].COUNTRY = "USA";

myObj[1].TITLE = "Hide your heart"; 
myObj[1].ARTIST = "Bonnie Tyler";
myObj[1].COUNTRY = NULL;

myObj[2].TITLE = "Greatest Hits"; 
myObj[2].ARTIST = NULL;
myObj[2].COUNTRY = NULL;

我的第一个想法是使用一些多选XPath,或选择3个列表(3个不同的xpath),但我不知道如何在元素不存在的情况下返回NULL。

1 个答案:

答案 0 :(得分:1)

你可以有一个处理内部元素存在的方法,如下所示。但是,如果您要将XML文件转换为C#对象,也许您可​​以查看序列化属性。

class Program
{
    static void Main(string[] args)
    {

        var doc = new XmlDocument();
        doc.LoadXml(@"<CATALOG>...</CATALOG>");

        var items = new List<CompactDisk>();
        foreach (XmlElement cd in doc.SelectNodes("//CD"))
        {
            items.Add(new CompactDisk
            {
                Title = GetValue(cd, "TITLE"),
                Artist = GetValue(cd, "ARTIST"),
                Country = GetValue(cd, "COUNTRY"),
            });

        }
    }

    static string GetValue(XmlElement node, string xpath)
    {
        var result = node.SelectSingleNode(xpath);
        return result == null ? null : result.InnerText;
    }

    class CompactDisk
    {
        public string Title   { get; set; }
        public string Artist  { get; set; }
        public string Country { get; set; }
    }
}