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