【问题标题】:How to read key value from plist (xml) in C#如何从 C# 中的 plist (xml) 中读取键值
【发布时间】:2015-08-18 12:09:16
【问题描述】:

我只想获取 softwareVersionBundleId 和捆绑版本密钥的字符串 如何将其存储到字典中以便我可以轻松获取?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>genre</key>
    <string>Application</string>
    <key>bundleVersion</key>
    <string>2.0.1</string>
    <key>itemName</key>
    <string>AppName</string>
    <key>kind</key>
    <string>software</string>
    <key>playlistName</key>
    <string>AppName</string>
    <key>softwareIconNeedsShine</key>
    <true/>
    <key>softwareVersionBundleId</key>
    <string>com.company.appname</string>
</dict>
</plist>

我尝试了以下代码。

            XDocument docs = XDocument.Load(newFilePath);
            var elements = docs.Descendants("dict");
            Dictionary<string, string> keyValues = new Dictionary<string, string>();



            foreach(var a in elements)
            {

               string key= a.Attribute("key").Value.ToString();
               string value=a.Attribute("string").Value.ToString();
                keyValues.Add(key,value); 
            }

它正在抛出对象引用异常。

【问题讨论】:

    标签: c# xml dictionary


    【解决方案1】:

    有错误

    a.Attribute("key").Value
    

    因为没有属性。您应该使用 Name 和 Value 属性而不是属性

    更多详情您可以查看:XMLElement

    foreach(var a in elements)
    {
        var key= a.Name;
        var value = a.Value;
        keyValues.Add(key,value); 
    }
    

    这种方法还有另一种方法

    var keyValues = elements.ToDictionary(elm => elm.Name, elm => elm.Value);
    

    【讨论】:

    • 感谢您的回复!。 xelement 不包含intertext 的定义?
    • xelement不包含intertext的定义?
    • 欢迎@ManikandanSai
    【解决方案2】:

    &lt;key&gt; 以及 &lt;string&gt;&lt;true/&gt; 不是属性,它们是 &lt;dict&gt; 的子元素,按邻近度配对。要构建您的字典,您需要将它们压缩在一起,如下所示:

            var keyValues = docs.Descendants("dict")
                .SelectMany(d => d.Elements("key").Zip(d.Elements().Where(e => e.Name != "key"), (k, v) => new { Key = k, Value = v }))
                .ToDictionary(i => i.Key.Value, i => i.Value.Value);
    

    结果是一个包含以下内容的字典:

    {
      "genre": "Application",
      "bundleVersion": "2.0.1",
      "itemName": "AppName",
      "kind": "software",
      "playlistName": "AppName",
      "softwareIconNeedsShine": "",
      "softwareVersionBundleId": "com.company.appname"
    }
    

    【讨论】:

      【解决方案3】:

      你可以试试这个 Nuget 包:https://www.nuget.org/packages/PListDeserializer/ 或 git:https://github.com/maksgithub/PListSerializer

      class MyClass
      {
          [PlistName("genre")]
          public string Genre { get; set; }
      
          [PlistName("bundleVersion")]
          public string BundleVersion { get; set; }
      
          [PlistName("itemName")]
          public string ItemName { get; set; }
      
          [PlistName("kind")]
          public string Kind { get; set; }
      
          [PlistName("playlistName")]
          public string PlaylistName { get; set; }
      
          [PlistName("softwareIconNeedsShine")]
          public bool SoftwareIconNeedsShine { get; set; }
      
          [PlistName("softwareVersionBundleId")]
          public string SoftwareVersionBundleId { get; set; }
      }
      
      
      var byteArray = Encoding.ASCII.GetBytes(YourPlist.plist);
      var stream = new MemoryStream(byteArray);
      var node = PList.Load(stream);
      var deserializer = new Deserializer()
      deserializer.Deserialize<MyClass>(rootNode);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-28
        • 2023-03-17
        • 1970-01-01
        • 2017-08-11
        • 1970-01-01
        相关资源
        最近更新 更多