如何在Xamarin中使用XDocument.Load中的相对路径?

时间:2019-01-08 02:30:44

标签: xamarin xamarin.android

我总是得到系统未找到异常。如何在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>

1 个答案:

答案 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

希望这会有所帮助。-