Asad Ahmad
Asad Ahmad

Reputation: 29

How to load xml file to xamarin android

i save the Xml file in Assets folder and set Build Action to Android Assets now when i try to save the changes to xml file it gives exception System.UnauthorizedAccessException: Access to the path "/Q317664.xml" is denied.i am not sure why this exception is occurring please help me

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.IO;
using System.Reflection;
using Android.Content.Res;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App17 
{
[Activity(Label = "App17", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    int count = 1;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        var xml = XDocument.Load(Assets.Open("Q317664.xml"));
        var node = xml.Descendants("Book").FirstOrDefault(cd => cd.Attribute("Id").Value == "1");
        node.SetAttributeValue("ISBN", "new");
        xml.Save("Q317664.xml");
     //   Button button = FindViewById<Button>(Resource.Id.MyButton);

       // button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };
    }
}
}

Upvotes: 0

Views: 6321

Answers (2)

matthewrdev
matthewrdev

Reputation: 12190

The Assets directory in the application bundle is read-only, you cannot write to the Q317664.xml xml document that you open. This is the cause of the System.UnauthorizedAccessException.

If you want to modify something bundled in the assets directory, extract it to a writeable location and then operate on that copy:

string fileName = "Q317664.xml";
string filePath = Path.Combine (Android.OS.Environment.ExternalStorageDirectory.ToString (), fileName);
// Check if your xml file has already been extracted.
if (!File.Exists(filePath))
{
    using (BinaryReader br = new BinaryReader(Assets.Open(fileName)))
    {
        using (BinaryWriter bw = new BinaryWriter(new FileStream(dbPath, FileMode.Create)))
        {
            byte[] buffer = new byte[2048];
            int len = 0;
            while ((len = br.Read(buffer, 0, buffer.Length)) > 0)
            {
                bw.Write (buffer, 0, len);
            }
        }
    }
}

// Operate on the external file
var xml = XDocument.Load(filePath);
var node = xml.Descendants("Book").FirstOrDefault(cd => cd.Attribute("Id").Value == "1");
node.SetAttributeValue("ISBN", "new");
xml.Save("Q317664.xml");

See:

Upvotes: 1

Sreeraj
Sreeraj

Reputation: 2434

You need to Add the XML file to Assets folder in Xamarin Android project

Then you can load Xml into variable like this

var xml = XDocument.Load(Assets.Open("data.xml"));

Upvotes: 0

Related Questions