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 :
e tutto andrebbe a posto, ho provato a mano e funziona con la deserializzazionecodice:<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">
il problema è che ho un xmlreader cosi :
il rpoblema è che quando il deserializzatore legge il namespace dell elemento mi da quest errore :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; }
e invece dovrebbe essere corretto, si nota chiaramente l'errore xmlns='xmlns:xsi come faccio a togliere quel dannato xmlns=' ????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)}
grazie

Rispondi quotando