Avatar billede mmbn Nybegynder
25. maj 2005 - 13:52 Der 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?
Avatar billede mmbn Nybegynder
25. maj 2005 - 13:54 #1
med en struktur således:
<Table>
    <TABELTITEL>XXX</TABELTITEL>
    <FELTDEFTITEL>XXX</FELTDEFTITEL>
    <ORDINAL_POSITION>1</ORDINAL_POSITION>
    <DATATYPE>NUMBER</DATATYPE>
    <LENGTH>22</LENGTH>
    <SCALE>0</SCALE>
    <PN>Primær nøgle</PN>
    <FN>fremmednøgle</FN>
    <FREMMEDTABEL>XXX</FREMMEDTABEL>
    <FELTINFO>XXX</FELTINFO>
  </Table>
Avatar billede roenving Novice
25. maj 2005 - 13:55 #2
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 !-)
Avatar billede mmbn Nybegynder
25. maj 2005 - 14:13 #3
jeg er forholdsvis ny indefor dette, så eksempler kunne være godt:)
Avatar billede roenving Novice
25. maj 2005 - 14:27 #4
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);
Avatar billede roenving Novice
25. maj 2005 - 14:29 #5
Hvis du har behov for det, må du godt overloade constructoren, men der _skal_ være en tom constructor !-)
Avatar billede mmbn Nybegynder
25. maj 2005 - 14:32 #6
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?
Avatar billede roenving Novice
25. maj 2005 - 14:47 #7
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 !-)
Avatar billede mmbn Nybegynder
25. maj 2005 - 15:04 #8
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?
Avatar billede mmbn Nybegynder
25. maj 2005 - 15:05 #9
oraAdap.Fill(dataset); er selvfølgelig med
Avatar billede mmbn Nybegynder
25. maj 2005 - 15:19 #10
hvor writexml er:
public void writeXML(string fileName)
{
    dataSet.WriteXml(fileName);
}
Avatar billede mmbn Nybegynder
25. maj 2005 - 16:07 #11
den fejler når jeg prøver at læse fra xml'en:
An unhandled exception of type 'System.InvalidOperationException' occurred in system.xml.dll

Additional information: There is an error in XML document (2, 2).
Avatar billede mmbn Nybegynder
25. maj 2005 - 16:08 #12
håber at du kan hjælpe jeg er newbie indenfor det her :S
Avatar billede roenving Novice
25. maj 2005 - 16:18 #13
Hvordan ser det ud ?-)
Avatar billede roenving Novice
25. maj 2005 - 16:19 #14
-- altså dokumentet ...

-- 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]
Avatar billede mmbn Nybegynder
26. maj 2005 - 08:24 #15
klasserne jeg bruger er:

database conn:

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;

namespace DbConnectODP
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    public class ConnectDB
    {
        private OracleConnection oraConn;
        private OracleCommand oraCom;
        private OracleDataAdapter oraAdap;
                private DataSet dataSet;
        private DataSet dSetFirst;
        private DataSet dSetSecond;
               
        public ConnectDB()
        {
            oraConn = new OracleConnection();
            oraConn.ConnectionString = "User ID=XXX;Password=XXX;Data Source=XXX;";
            oraConn.Open();     
            //System.Diagnostics.Debug.WriteLine("connected " + oraConn.ServerVersion);
        }

        public void executeQuery(string query, string fileName)
        {
            oraAdap = new OracleDataAdapter();
            oraAdap.SelectCommand = new OracleCommand(query,oraConn);
            dataSet = new DataSet();
            oraAdap.Fill(dataSet);
            //showDataset();
            writeXML(fileName);
        }
       
       
        public void writeXML(string fileName)
        {
            dataSet.WriteXml(fileName);
        }

        public void close()
        {
            oraConn.Close();
            oraConn.Dispose();
        }
    }
}

og den fra dig (håber jeg har ramt hvad du mener :)):
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace DbConnectODP
{
    /// <summary>
    /// Summary description for TableObject.
    /// </summary>
    [XmlRoot()]
    public class TableObject
    {
        private string tabeltitel;
        private string feltDefTitel;
        private string ordinalPosition;
        private string dataType;
        private string length;
        private string scale;
        private string pn;
        private string fn;
        private string fremmedTabel;
        private string feltInfo;

        [XmlElement()]
        public string TABELTITEL
        {
            get{return tabeltitel;}
            set{tabeltitel = value;}
        }
        [XmlElement()]
        public string FELTDEFTITEL
        {
            get{return feltDefTitel;}
            set{feltDefTitel = value;}
        }
        [XmlElement()]
        public string ORDINAL_POSITION
        {
            get{return ordinalPosition;}
            set{ordinalPosition = value;}
        }
        [XmlElement()]
        public string DATATYPE
        {
            get{return dataType;}
            set{dataType = value;}
        }
        [XmlElement()]
        public string LENGTH
        {
            get{return length;}
            set{length = value;}
        }
        [XmlElement()]
        public string SCALE
        {
            get{return scale;}
            set{scale = value;}
        }
        [XmlElement()]
        public string PN
        {
            get{return pn;}
            set{pn = value;}
        }
        [XmlElement()]
        public string FN
        {
            get{return fn;}
            set{fn = value;}
        }
        [XmlElement()]
        public string FREMMEDTABEL
        {
            get{return fremmedTabel;}
            set{fremmedTabel = value;}
        }
        [XmlElement()]
        public string FELTINFO
        {
            get{return feltInfo;}
            set{feltInfo = value;}
        }

        public TableObject()
        {
        }
    }
}

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";

            string fileNamePnFn = Application.StartupPath + "\\PNKEY.xml";
            connDB.executeQuery(sqlPnFn,fileNamePnFn);

            string sqlTableDef = "SELECT dcc.table_name Tabeltitel, "+
                "dcc.column_name FeltDefTitel, "+
                "dtc.column_id Ordinal_Position, "+
                "dtc.data_type DataType, "+
                "dtc.Data_Length Length, "+
                "dtc.Data_Precision Precision, "+
                "dtc.Data_Scale Scale, "+
                "dcc.comments FeltInfo "+
                "FROM "+
                "user_col_comments dcc, "+
                "user_tab_columns dtc, "+
                "user_tab_comments utc "+
                "WHERE "+
                "dcc.table_name = dtc.table_name "+
                "AND dcc.column_name = dtc.column_name "+
                "AND dcc.table_name = utc.table_name "+
                "AND utc.table_type = 'TABLE' "+
                "ORDER BY dtc.table_name, dtc.column_id";
            string fileNametableDef = Application.StartupPath + "\\TABLEDEF.xml";
            connDB.executeQuery(sqlTableDef,fileNametableDef);
        }

håber at det giver dig et overblik
Avatar billede mmbn Nybegynder
26. maj 2005 - 08:28 #16
jeg har ikke befolket det endnu. mener du at jeg skal lave udtrækket fra db direkte til TableObject klassen?
Avatar billede roenving Novice
26. maj 2005 - 09:20 #17
I et lynhurtigt gennemsyn ser det rigtigt ud, men jeg må kigge nærmere på det, og det bliver nok først efter i morgen !-)
Avatar billede mmbn Nybegynder
26. maj 2005 - 09:25 #18
helt iorden :) glæder mig til at høre mere ;)
Avatar billede mmbn Nybegynder
26. maj 2005 - 11:33 #19
jeg fik det til at virke med dit forslag :) smid et svar og få dine velfortjente point.:)

Et sidespøgsmål:

når jeg skriver til xml'en oprettes der et tableobject for hvert element, kan det ændres? og kan man ændre
<TableObject xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
toppen?
Avatar billede roenving Novice
26. maj 2005 - 11:37 #20
-- i xml-filen ?-)

-- og jeg tror at det er muligt at ændre schema, men hvad skulle formålet være, du skal vel ikke hånd-parse den !-)

Els velbekomme '-)
Avatar billede mmbn Nybegynder
26. maj 2005 - 12:26 #21
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:

<?xml version="1.0" encoding="utf-8"?>
<TableObject xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <TABELTITEL>XXX</TABELTITEL>
  <FELTDEFTITEL>XXX</FELTDEFTITEL>
  <ORDINAL_POSITION>3</ORDINAL_POSITION>
  <DATATYPE>CHAR</DATATYPE>
  <LENGTH>1</LENGTH>
  <PRECISION />
  <SCALE />
  <PN>XXX</PN>
  <FN>XXX</FN>
  <FREMMEDTABEL>XXX</FREMMEDTABEL>
</TableObject><?xml version="1.0" encoding="utf-8"?>
<TableObject xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <TABELTITEL>XXX</TABELTITEL>
  <FELTDEFTITEL>XXX</FELTDEFTITEL>
  <ORDINAL_POSITION>3</ORDINAL_POSITION>
  <DATATYPE>CHAR</DATATYPE>
  <LENGTH>1</LENGTH>
  <PRECISION />
  <SCALE />
  <PN>XXX</PN>
  <FN>XXX</FN>
  <FREMMEDTABEL>XXX</FREMMEDTABEL>
</TableObject>

mit spørgsmål er så: er det muligt kun at skrive elementerne ind ved hvert loop så
<TableObject xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

ikke kommer til at stå flere gange i xml'en?
Avatar billede mmbn Nybegynder
26. maj 2005 - 12:39 #22
toppen af xml'en skulle gerne ændres til:

<TableObject xmlns="sa_metadata" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="sa_metadata sa_md_11.xsd" sa_version="1.1">
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester