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 :
codice:
<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 :
codice:
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();
       %reate(file, settings,p)%mlNamespaceManager 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 :
codice:
{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