none
utilizar fileStream para una variable local RRS feed

  • Pregunta

  • Hola tengo un problema haber si alguien me lo puede resolver, tengo que dar formato a un xmldatadocument con xml schema y lo realizo de la siguiente manera:





    AccesoBD
    v_accesoBD = new AccesoBD();

     

     

    DataSet v_ds = new DataSet();

    v_ds.Clear();

    v_ds.Tables.Clear();
    v_ds = v_accesoBD.BDCargarOperadores();

    XmlDataDocument nuevo = new XmlDataDocument(v_ds);//variable local del tipo xmlDataDocuement

    string

     

    schemaFile = Server.MapPath(@"App_Data\SuperProProductList.xsd");

    settings.Schemas.Add(

    "http://tempuri.org/SuperProProductList.xsd",

    schemaFile);

     


    XmlReaderSettings

     

    settings = new XmlReaderSettings();

    settings.ValidationType =

    ValidationType.Schema;

     

     




     

     


    FileStream

     

    fs = new FileStream(nuevo, FileMode.Open);

     

    XmlReader r= XmlReader.Create(fs, settings);


    while

     

    (r.Read())

    {

     

    }

    fs.Close();

     

    El problema que me da al hacerlo asi, es que como el xmlDatadocument es local no puedo utilizar FileStream pq el error que da es q no encuentra la ruta de acceso , lo cual es normal, ya que es una variable local.
    ¿Hay alguna manera de hacerlo siendo xmlDataDocument una variable local?
    Espero haberme explicado con claridad, muchas gracias.

    jueves, 16 de abril de 2009 17:00

Todas las respuestas

  • hola,

    Lo que deberias hacer primero es del objeto XmlDataDocument obtener el string del xml con XmlNode. OuterXml

    Luego utilizas esta tecnica de este link: Write XML String to MemoryStream
    Para pasarlo a un MemoryStream.

    Por ultimo utilizas este ultimo con el create del  XmlReader.

    Podrias utilizar algo como esto:

    System.Text.ASCIIEncoding myEncoder = new
     System.Text.ASCIIEncoding();
    byte [] bytes = myEncoder.GetBytes(myString);
    MemoryStream ms = new MemoryStream(bytes);
    el myString seria el valor del OuterXml del XmlDataDocument.



    Creo que de esta forma deberia funcionar.
    Saludos
    Leandro Tuttini
    jueves, 16 de abril de 2009 19:25
  • Hice esto:

    AccesoBD

     

    v_accesoBD = new AccesoBD();

     

    DataSet oper = new DataSet();

     

    DataSet v_ds = new DataSet();

    v_ds.Clear();

    v_ds.Tables.Clear();

    v_ds = v_accesoBD.BDCargarOperadores();

     

     

    XmlDataDocument nuevo = new XmlDataDocument(v_ds);

     

    string myString = nuevo.OuterXml;

     

    MemoryStream ms = new MemoryStream();

     

    StreamWriter sw = new StreamWriter(ms);//Falta el encoding

    sw.WriteLine(nuevo);

    sw.Flush();

    ms.Position = 0;

     

     

     

     

    XmlReader xr = new XmlTextReader(ms);

     

    // Configure the reader to use validation.

     

    XmlReaderSettings settings = new XmlReaderSettings();

    settings.ValidationType =

    ValidationType.Schema;

     

     

    string schemaFile = Server.MapPath(@"App_Data\SuperProProductList.xsd");

    settings.Schemas.Add(

    "http://tempuri.org/SuperProProductList.xsd",

    schemaFile);

     

    XmlReader r= XmlReader.Create(ms, settings);

     

     

    // Read through the document.

     

    while (r.Read())

    {

     

    }

     

    ms.Close();

    ms.Dispose();

    sw.Close();

    sw.Dispose();

    xr.Close();

    r.Close(); 

     

    return nuevo;
    pero me sigue sin funcionar, es q no entendi muy bien lo q tenia q hacer, si me puedes decir es q estoy cometiendo el fallo, muchas gracias

    viernes, 17 de abril de 2009 12:33
  • Ahora me funciona lo me dijiste lo hago asi: pongo el métod completo porque ahora tengo una duda, el metodo tiene que devolver un xmldatadocument , pero al devolver nuevo no tiene lo que pone el xsd, no tiene los nombres de las etiquetas que yo pongo en el xsd, que estoy haciendo mal?

    [

    WebMethod]

     

    public XmlDataDocument TosdosOperadorespru()

    {

     

    AccesoBD v_accesoBD = new AccesoBD();

     

    DataSet oper = new DataSet();

     

    DataSet v_ds = new DataSet();

    v_ds.Clear();

    v_ds.Tables.Clear();

    v_ds = v_accesoBD.BDCargarOperadores();

     

     

    XmlDataDocument nuevo = new XmlDataDocument(v_ds);

     

    string myString = nuevo.OuterXml;

    System.Text.

    ASCIIEncoding myEncoder = new System.Text.ASCIIEncoding();

     

    byte[] bytes = myEncoder.GetBytes(myString);

     

    MemoryStream ms = new MemoryStream(bytes);

     

    XmlReaderSettings settings = new XmlReaderSettings();

    settings.ValidationType =

    ValidationType.Schema;

     

     

    string schemaFile = Server.MapPath(@"App_Data\SuperProProductList.xsd");

    settings.Schemas.Add(

    "http://tempuri.org/SuperProProductList.xsd",

    schemaFile);

     

    XmlReader r = XmlReader.Create(ms, settings);

     

    return nuevo;

    }

    viernes, 17 de abril de 2009 16:41
  • hola,

    Lo que te aconsejaba en el post anterior es que el webmethod no devolviera un XmlDataDocument, sino que utilizara un string simple.

    [WebMethod]
    public string TodosOperadorespru()
    {
    .
    .
    .
    
    return nuevo.OuterXml;
    
    }

    Por supuesto el tema de schema en realidad lo ideal serial utilizarlo del lado del cliente, para validar que el servicio entrego un xml valido y bien formado.

    Tambien te comentaba que en realidad podrias twener otra alternativa a un string y es hacer uso del XmlNode:

    Using Typed DataSets with Web Services

    [WebMethod]
    public XmlNode TodosOperadorespru()
    {
    .
    .
    .
    
    return nuevo;
    
    }

    Fijate de intentar con estos a ver como resulta.

    Tambien te aconsejaria darle una mirada a estos links:

    XmlDocument. Validate Method

    Por ahi no tanto por el metodo Validate, sino por las primeras lineas:

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
    settings.ValidationType = ValidationType.Schema;
    
    XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
    XmlDocument document = new XmlDocument();
                document.Load(reader);
    

    Como veras hace uso directamente de un XmlDocument para agregar el schema, por ahi esto te de una idea.

    Saludos

    Leandro Tuttini
    domingo, 19 de abril de 2009 15:00