25. maj 2005 - 13:52Der er
21 kommentarer og 1 løsning
hjælp til xml håndtering
jeg har to xml'er. Den ene har følgende struktur. <Table> <TABELTITEL>XXX</TABELTITEL> <PN>Primær nøgle</PN> <FN>fremmednøgle</FN> <FREMMEDTABEL>XXXX</FREMMEDTABEL> </Table>
den anden har denne struktur: <Table> <TABELTITEL>XXX</TABELTITEL> <FELTDEFTITEL>XXX</FELTDEFTITEL> <ORDINAL_POSITION>1</ORDINAL_POSITION> <DATATYPE>NUMBER</DATATYPE> <LENGTH>22</LENGTH> <SCALE>0</SCALE> <FELTINFO>XXX</FELTINFO> </Table>
mit spørgsmål er, kan man sammenligne felterne TABELTITEL på begge to og derefter hive primær og fremmenøgler og fremmedtabel ind til evet en tredje xml der så skal indeholde samtlige oplysninger fra hver tabel?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Ja, hvis du starter med at lave et Table-objekt, som indeholder samtlige properties, kan du deserialisere begge xml'er i to forskellige instanser og flytte alle værdier ind i den ene instans og serialisere igen !-)
Du skal sørge for at have de rigtige namespaces inkluderet:
using System; using System.IO; using System.Xml; using System.Xml.Serialization;
-- så skal du opbygge et object med en property for hvert undertag og en tom constructor:
[XmlRoot()] public class Table { private string tabeltitel; //... [XmlElement()] public string TABELTITEL { get{return tabeltitel;} set{tabeltitel = value;} } //... public Table() { // // TODO: Add constructor logic here // } }
-- og så deserialiserer du sådan:
XmlSerializer xs = new XmlSerializer(typeof(Table)); StreamReader sr = new StreamReader(filename); return (Table)xs.Deserialize(sr);
-- det laver du som en funktion, kalder den med to forskellige filnavne til to forskellige instanser af et Table-objekt, overfører de tre properties fra det ene objekt til det andet og serialiserer igen:
XmlSerializer xs = new XmlSerializer(typeof(Table)); StreamWriter sw = new StreamWriter(filename); xs.Serialize(sw,myTableObject);
det er altså det her: XmlSerializer xs = new XmlSerializer(typeof(Table)); StreamReader sr = new StreamReader(filename); return (Table)xs.Deserialize(sr); der laves som en funktion?
Ja, for det skal du kalde for at oprette to forskellige instanser af Table-objektet, med forskellige filnavne ...
-- men den case, jeg har opbygget kan meget vel være alt for forsimplet til din virkelighed, så du måske skal have et overobjekt, som består af et array af Table-elementer !-)
sådan som det er oprettet nu så skriver jeg xml'erne ud fra database oplysninger: oraAdap = new OracleDataAdapter(); oraAdap.SelectCommand = new OracleCommand(query,oraConn); dataSet = new DataSet(); writeXML(fileName);
hvordan bliver de informationer lagt ind i et Table objekt?
-- men vil det forøvrigt ikke være en fordel at springe xml-filen over, og så direkte oprette det ny objekt, befolke det med udtrækket og så serialisere ?o]
using System; using Oracle.DataAccess.Client; using Oracle.DataAccess.Types; using System.Data; using System.Collections; using System.IO; using System.Xml; using System.Xml.Serialization;
disse to er et class lib for sig selv, de bliver kaldt med: private void button1_Click(object sender, System.EventArgs e) { string sqlPnFn = "SELECT pk.table_name Tabeltitel, "+ "pk.constraint_name pn, "+ "fk.constraint_name fn, "+ "fk.table_name FremmedTabel "+ "FROM "+ "user_constraints pk, "+ "user_constraints fk "+ "WHERE "+ "pk.constraint_name = fk.r_constraint_name "+ "AND pk.constraint_type='P' "+ "AND fk.constraint_type='R' "+ "ORDER BY pk.table_name";
schemaet fås et andet sted fra. er det muligt et redigere stien til xsd filen? når jeg indstætter i tableobjektet sker dette via foreach() gennemgang af et dataset og der skrives derefter til filen. outputtet er:
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.