442 messaggi dal 09 marzo 2006
ciao , devo fare il parsing di documenti xml molto grandi tipo 4 / 5 gb , ho pensato di utilizzare un xmlreader personalizzato che lavori tipo sax per ipotesi.
io ho gli xsd e ho creato le classi con xml2code.
Vorrei utilizzare un xmlreader Faccio questo perchè questi file non sono tutti uguali , hanno delle piccole differenze da sistemare prima di deserializzare: namespace da cambiare o attributi con nome diverso, e con xmlreader farei tutto "al volo" senza caricare tutto in memoria prima.
per es:in un tipo di xmlreader devo cambiare questo elemento :
<doc:iso_10303_28 xmlns:exp="urn:oid:1.0.10303.28.2.1.1" xmlns:doc="urn:oid:1.0.10303.28.2.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oid:1.0.10303.28.2.1.1 ex.xsd" version="2.0">
in questo:
<iso_10303_28 version="2.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns="urn:iso.org:standard:10303:part(28):version(2):xmlschema:common"
    xsi:schemaLocation="urn:iso.org:standard:10303:part(28):version(2):xmlschema:common ex.xsd">


e tutto andrebbe a posto, ho provato a mano e funziona con la deserializzazione

il problema è che ho un xmlreader cosi :
using System;
using System.Xml;
using System.Xml.Schema;
using System.Collections;
using System.Collections.Generic;
using System.Xml.Serialization;

namespace xmlUtils {
    public class IfcAllplanReader : XmlWrappingReader
    {
        private bool _uos = false;
        private bool _iso = false;
        private bool _header = false;
        private bool _id = false;
        private bool readingAssociation = false;
        private string _currentkey;
        private Dictionary<string, string> dictnmsp = new Dictionary<string, string>();
        public IfcAllplanReader(string file)
            : base(XmlReader.Create(file))
        {
        
            NameTable nt = new NameTable();
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
            nsmgr.RemoveNamespace("exp", "urn:oid:1.0.10303.28.2.1.1");
            nsmgr.RemoveNamespace("doc", "urn:oid:1.0.10303.28.2.1.3");
            nsmgr.RemoveNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
            nsmgr.RemoveNamespace("schemaLocation", "urn:oid:1.0.10303.28.2.1.1 ex.xsd");
            nsmgr.RemoveNamespace("xmlns", "");
            nsmgr.AddNamespace("xmlns:xsi", @"http://www.w3.org/2001/XMLSchema-instance");
            nsmgr.AddNamespace("xmlns:xlink", @"http://www.w3.org/1999/xlink");
          
            nsmgr.AddNamespace("xsi:schemaLocation", @"urn:iso.org:standard:10303:part(28):version(2):xmlschema:common  http://www.iai-tech.org/ifcXML/IFC2x3/FINAL/ex.xsd");
          
        }
        public IfcAllplanReader(string file, XmlReaderSettings settings,XmlParserContext p)
            : base(XmlReader.Create(file, settings,p))
        {
            
            
            dictnmsp.Add("version", "2.0");
            dictnmsp.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
            dictnmsp.Add("xlink", "http://www.w3.org/1999/xlink");
            dictnmsp.Add("xmlns", "urn:iso.org:standard:10303:part(28):version(2):xmlschema:common");
            dictnmsp.Add("schemaLocation", "urn:iso.org:standard:10303:part(28):version(2):xmlschema:common  http://www.iai-tech.org/ifcXML/IFC2x3/FINAL/ex.xsd");
                    
        }
        public override string Prefix
        {
            get
            {
                return this.reader.Prefix;
            }
        }
        public override void ReadStartElement(string localName, string ns)
        {
          try{
                base.reader.ReadStartElement(localName, "");
              }catch( Exception ex)
              {
                  
              }
                  
          }
        public override void ReadEndElement()
        {

            string str = base.reader.Prefix;
          
                base.reader.Skip();
        
        }

        public override String Name
        {
            get
            {
                if (readingAssociation)
                    return "iso_10303_28 version=\"2.0\"    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"     xmlns:xlink=\"http://www.w3.org/1999/xlink\" xsi:schemaLocation=\"urn:iso.org:standard:10303:part(28):version(2):xmlschema:common  http://www.iai-tech.org/ifcXML/IFC2x3/FINAL/ex.xsd\"";
                else
                    return base.reader.LocalName;
            }
        }
 
       public override bool Read ()
       {
           bool result;
           result = base.Read();
           if (base.NodeType == XmlNodeType.Element && base.reader.Name == "doc:iso_10303_28")
               readingAssociation = true;
           return result;
       }

       public override string LocalName
       {
           get
           {


               switch (NodeType)
               {
                   case XmlNodeType.Element:
                       if (base.LocalName == "iso_10303_28")
                       {
                           _iso = true;
                           // return "iso_10303_28";

                           return "iso_10303_28 version=\"2.0\" ";
                       }
                       if (base.LocalName == "iso_10303_28_header")
                       {
                           _header = true;
                           // return "iso_10303_28";
                           return "iso_10303_28_header";
                       }
                       if (base.LocalName == "express")
                       {

                           return "express id=\"exp_1\" external=\"\" schema_name=\"IFC2X3\"";

                       }
                       if (base.LocalName == "uos")
                       {
                           _uos = true;
                           return "uos id=\"uos_1\" description=\"\" configuration=\"i-ifc2x3\" edo=\"\" ";

                       }
                       if (base.Prefix == "exp" && base.LocalName == "double-wrapper")
                       {
                           return "ex:double-wrapper";
                       }

                       Console.WriteLine(base.LocalName);
                       break;
                       return base.LocalName;
                   case XmlNodeType.Attribute:
                       if (dictnmsp.ContainsKey(base.LocalName))
                       {
                           string str = dictnmsp[base.LocalName];
                           return str;
                       }
                       return base.LocalName;
                       if (_id && base.Prefix == "exp" && base.LocalName == "cType")
                       {
                           return "ex:cType";
                           _id = false;

                       }
                       if (base.LocalName == "id")
                           _id = true;
                       return base.LocalName;

                       if (base.LocalName == "exp")
                       {
                           return "ex";
                       }
                       else
                           Console.WriteLine(base.LocalName);
                       return base.LocalName;
                       break;
                   case XmlNodeType.Text:
                       if (base.Name != "")
                           return base.LocalName;
                       break;
               }
               if (base.LocalName == "uos")
               {
                   _uos = true;
               }
               return base.LocalName;
           }
       }
        public override string Value
        {
            get
            {
        
                return base.Value;
            }
        }
        public override string NamespaceURI
        {
            get
            {

               return "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"urn:iso.org:standard:10303:part(28):version(2):xmlschema:common\" xsi:schemaLocation=\"urn:iso.org:standard:10303:part(28):version(2):xmlschema:common ex.xsd\"";
                
            }
        }
  

        public void writeall()
        {
            using (XmlWriter xmlWriter = XmlWriter.Create(@"c:\ifc\file.xml"))
            {

                xmlWriter.WriteNode(base.reader, false);

            }
        }
        private static XmlSerializerNamespaces getIfcNamespaces()
        {
            XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
            return xsn;
        }
        
    }
}
public class attributenamespace
{
    public attributenamespace(string attribute, string url)
    {
        _attribute = attribute;
        _url = url;

    }
    public string _attribute;
    public string _url;

}

il rpoblema è che quando il deserializzatore legge il namespace dell elemento mi da quest errore :
{System.InvalidOperationException: Errore nel documento XML. ---> {System.InvalidOperationException: Errore nel documento XML. ---> System.InvalidOperationException:{System.InvalidOperationException: Errore nel documento XML. ---> System.InvalidOperationException: <iso_10303_28 version="2.0"  xmlns='xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="urn:iso.org:standard:10303:part(28):version(2):xmlschema:common" xsi:schemaLocation="urn:iso.org:standard:10303:part(28):version(2):xmlschema:common ex.xsd"'> imprevisto.
   in Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderiso_10303.Read2135_iso_10303_28()
   --- Fine della traccia dello stack dell'eccezione interna ---
   in System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   in System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader)
   in ConsoleApplication1.Program.Main(String[] args)}

e invece dovrebbe essere corretto, si nota chiaramente l'errore xmlns='xmlns:xsi come faccio a togliere quel dannato xmlns=' ????
grazie
43 messaggi dal 30 gennaio 2016
Ciao Giuseppe, una domanda; devi soltanto modificare i file oppure fai altro ?
Ciao
442 messaggi dal 09 marzo 2006
ciao .
no non modifico il file Devo ritornare dall xmlreader ereditato su cui lavoro (quando è letto dal deserializzatore) dei dati leggermente diversi da quelli del documento togliere un attributo o un namespace ecc..., ci sarei riuscito ma mi inserisce sempre quel cavolo di xmls= che mi scasina il parsing , come posso toglierlo?
grazie.
43 messaggi dal 30 gennaio 2016
Ciao Giuseppe, scusami ma credo di non aver capito!
In poche parole a cosa servono questi Xml ?
Perché se è quello che penso credo proprio che ti stai incasinando la vita :)
442 messaggi dal 09 marzo 2006
il deserializzatore creato sulla base delle classi generate con l'xsd deve deserializzarmi l'xml ma attraverso l'xmlreader customizzato che mette a posto al volo l'xml che arriva al deserializzatore.
i file sono dell' ordine dei 3 4 gb, è per questo che cerco una soluzione che sia veloce.
inoltre devo deserializzare vari formati dell xml sulla base dell xsd che ha generato il tutto , quindi posso avere piu xmlreader per ogni formato ognuno di questi xmlreader fa il suo lavoro in un modo un po diverso , adatta in pratica delle piccole differenze.
non parlarmi di linq o caricare in meoria l'xml e poi gestirlo perchè non lo posso fare.
ciao.
43 messaggi dal 30 gennaio 2016
Tutto chiaro :)
Una situazione del genere (+ o -) l'ho gestita con delle list<t> e linq.
Come non detto cmq, ciao!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.