我总是得到系统未找到异常。如何在xamarin.android应用程序包中找到xml文件?
public Dictionary<string, string> TilePropertiesForTileID(short tileGid)
{
Dictionary<string, string> propertiesDict = null;
try
{
// Loading from a file, you can also load from a stream
var xml = XDocument.Load(Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), "Assets/Content/tileMap/wood_tileset.tsx"));
// Query the data and write out a subset of contacts
var propertiesQuery = from c in xml.Root.Descendants("tile")
where (int)c.Attribute("id") == tileGid
select c.Element("property").Value;
foreach (string property in propertiesQuery)
{
Console.WriteLine("Property: {0}", property);
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw e;
}
return propertiesDict;
}
此行:
var xml = XDocument.Load(Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), "Assets/Content/tileMap/wood_tileset.tsx"));
总是抛出异常。我不知道如何访问此文件。
已更新:感谢apineda,我现在能够找到该文件:这是xml文件
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.2" tiledversion="1.2.1" name="wood_tileset"
tilewidth="32" tileheight="32" tilecount="256" columns="16">
<image source="wood_tileset.png" width="512" height="512"/>
<tile id="68">
<properties>
<property name="IsTreasure" value="true"/>
</properties>
</tile>
</tileset>
答案 0 :(得分:4)
为此,您不一定需要文件的完整路径。由于您已将该文件放置在Assets目录中,并且希望在 Build Action 中将其标记为AndroidAsset
,所以您需要使用AssetManager
。
如果您处于“活动”中,则可以在资产中打开文件,如下所示:
Assets.Open("fileName.ext")
如果您在Assets目录中添加了子目录,则需要包括完整路径(不包括单词“ Assets”)。
使用您的代码作为示例,它应如下所示:
using (var sReader = new StreamReader(Assets.Open("Content/titleMap/wood_tileset.tsx")))
{
var xmlDoc = XDocument.Load(sReader);
// Query the data and write out a subset of contacts
var propertiesQuery = xmlDoc.Root.Descendants("tile")
.Where(item => (int)item.Attribute("id") == tileGid)
.SelectMany(a => a.Descendants("property"))
.Select(property => new
{
Name = property.Attribute("name").Value,
Value = property.Attribute("value").Value
})
.ToList();
foreach (var property in propertiesQuery)
{
Console.WriteLine($"Property Name: {property.Name}, Value: {property.Value}");
}
}
您可以看到Assets.Open
方法的返回传递到StreamReader中。 using
不是必需的,但这可以防止打开资源。
然后,将StreamReader传递到Load()
的{{1}}方法中,其余方法与您所使用的完全相同。
注意:假设您具有以下文件结构:
XDocument
希望这会有所帮助。-