gpt4 book ai didi

ios - 在 WP7 中解析 iOS .plist 文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:33:04 24 4
gpt4 key购买 nike

我正在将 iOS 应用程序转换为 WP7。我想做的是在我的 WP7 应用程序中使用我为 iOS 应用程序创建的 plist 文件,而不对其进行任何更改。我尝试使用此处的库 http://codetitans.codeplex.com/但我只能向下解析一个级别,我的 plist 有多个级别。这是我尝试解析的 plist 文件的示例:

<?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>section0</key>
<dict>
<key>key0</key>
<dict>
<key>name</key>
<string>Title</string>
<key>type</key>
<string>text</string>
<key>filter</key>
<false/>
</dict>
<key>key1</key>
<dict>
<key>name</key>
<string>Season</string>
<key>type</key>
<string>text</string>
<key>filter</key>
<false/>
</dict>
</dict>
</dict>

最佳答案

第 1 部分:您要求的内容

WP 目前对动态类型的支持不是很好,因此虽然解析它并不困难,但使用它会很难看。

此类将使用 LINQ to XML 解析 PList:

public class PropertyListParser
{
public IDictionary<String, Object> Parse(string plistXml)
{
return Parse(XDocument.Parse(plistXml));
}

public IDictionary<String, Object> Parse(XDocument document)
{
return ParseDictionary(document.Root.Elements("plist")
.Elements("dict")
.First());
}

private IDictionary<String, Object> ParseDictionary(XElement dictElement)
{
return dictElement
.Elements("key")
.ToDictionary(
el => el.Value,
el => ParseValue(el.ElementsAfterSelf("*").FirstOrDefault())
);
}

private object ParseValue(XElement element)
{
if (element == null)
{
return null;
}

string valueType = element.Name.LocalName;

switch (valueType)
{
case "string":
return element.Value;
case "dict":
return ParseDictionary(element);
case "true":
return true;
case "false":
return false;
default:
throw new NotSupportedException("Plist element not supported: " + valueType);
}
}
}

这是一个如何使用它的示例(基于您的示例):

var parsedPlist = new PlistParser().Parse(Plist);

var section0 = (IDictionary<string, object>)parsedPlist["section0"];

var key0 = (IDictionary<string, object>)parsedPlist["key0"];

string type = (string)key0["type"];
bool filter = (bool)key0["filter"];

第 2 部分:您可能需要什么

话虽如此,实际上编写以这种方式使用它的代码会非常难看。根据您的架构,我会说以下内容实际上是您的应用程序所需要的。

// I'm not sure what your domain object is, so please rename this
public class ConfigEntry
{
public string Name { get; set; }
public string Type { get; set; }
public bool Filter { get; set; }
}

public class ConfigEntryLoader
{
private PropertyListParser plistParser;

public ConfigEntryLoader()
{
plistParser = new PropertyListParser();
}

public ICollection<ConfigEntry> LoadEntriesFromPlist(string plistXml)
{
var parsedPlist = plistParser.Parse(plistXml);

var section0 = (IDictionary<string, object>)parsedPlist["section0"];

return section0.Values
.Cast<IDictionary<string,object>>()
.Select(CreateEntry)
.ToList();
}

private ConfigEntry CreateEntry(IDictionary<string, object> entryDict)
{
// Accessing missing keys in a dictionary throws an exception,
// so if they are optional you should check if they exist using ContainsKey
return new ConfigEntry
{
Name = (string)entryDict["name"],
Type = (string)entryDict["type"],
Filter = (bool)entryDict["filter"]
};
}
}

现在当您使用 ConfigEntryLoader 时,您会得到一个 ConfigEntry 对象列表,这将使您的代码更容易维护,而不是传递字典。

ICollection<ConfigEntry> configEntries = new ConfigEntryLoader()
.LoadEntriesFromPlist(plistXml);

关于ios - 在 WP7 中解析 iOS .plist 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com