Avatar billede lumbye Nybegynder
18. september 2003 - 16:50 Der er 12 kommentarer og
1 løsning

Værdier fra XML til database

Jeg har følgende XML-struktur i en masse filer, hvor indhold skal hakkes i stykker og indsættes i en database:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<matchup>
<event id="2132" type="12">2003-08-23
<contestant id="12345" country="land">Groclin
<attrib id="14" type="100" weight="2">1</attrib>
<attrib id="23" type="200" weight="2">16</attrib>
<attrib id="16" type="100" weight="4">12</attrib>
<attrib id="500" type="300" weight="1">1</attrib>
</contestant>
<contestant id="67890" country="land">Warhammer
<attrib id="34" type="100" weight="1">4</attrib>
<attrib id="25" type="100" weight="3">6</attrib>
</contestant>
</event>
</matchup>

Der er altid 2 x contestant, mens antallet af attrib under dem hver er variabelt.

Jeg kan godt få plukket de enkelte elementer ud fra event og fra de to contestant'er, men attrib'erne volder store problemer!

Koden ønskes nedbrudt så det er muligt at loope på og indsætte alle instanser af attrib i en db-tabel så hver record kommer til at indeholde følgende:

event id
contestant id
contestant (singlenode, dvs. selve teksten i tag'en)
attrib id
attrib type
attrib weight
attrib (singlenode, dvs. selve teksten i tag'en)

Dvs. at alle attrib-værdier skal knyttes til både event og contestant.

Jeg har allerede greb om de øvrige ting end attrib'erne, men hvis der er én eller anden der kan lave en komplet, sammenhængende løsning til at plukke samtlige værdier, så er det naturligvis ikke værst :-)

Eftersom værdierne skal sendes til en database er XSL IKKE en mulighed.

Hjælp! ;-)

NB: XML-koden hentes ind i et parser-script fra en lokal fil via objektet Msxml2.DOMDocument. Såfremt det har betydning for løsningen...
Avatar billede arne_v Ekspert
18. september 2003 - 17:04 #1
Ikke et svar men et antal spørgsmål:

Hvilket programmerings-sprog ?

Er du opmærksom på at hvis deatabasen skal være normaliseret, så skal
den XML fil splittes ud i 2 tabeller ?
Avatar billede lumbye Nybegynder
18. september 2003 - 17:35 #2
Relevant nok...

Sproget er asp, og ja, jeg ved at jeg skal køre med (mindst) 2 tabeller.
Avatar billede arne_v Ekspert
18. september 2003 - 18:11 #3
Nu programmerer jeg selv mest i Java (ihvertfald for XML), så det kan kun blive
en skitse:

lookup list of events
for each event {
  save event info in event table
  lookup list of contestant
  for each contestant {
      save contestant info including event id in contestant table
      lookup list of attrib
      for each attrib {
          save attrib info including contestant id in attrib table
      }
  }
}
Avatar billede lumbye Nybegynder
18. september 2003 - 19:34 #4
Det er nok i den rigtige retning, arne_v, men jeg mangler lige netop den gyldne løsning på del hvor vi siger lookup list of attrib og gemmer den i tabellen.

Det er vel "bare" et loop på x antal childs til en child - anyone? :-)
Avatar billede arne_v Ekspert
18. september 2003 - 19:37 #5
I Java kalder man getChildNodes på en Node og får en NodeList
tilbage.

DOM er en W3C standard, så det mæ være "næsten" det samme i ASP/VB/MSXML.
Avatar billede lumbye Nybegynder
18. september 2003 - 19:46 #6
Har du et forslag? Måske til inspiration for mig eller andre...
Avatar billede medions Nybegynder
18. september 2003 - 21:03 #7
set xmldoc = Server.CreateObject("Microsoft.XMLDOM")
xmldoc.async=false
xmldoc.load(request)

for each x in xmldoc.documentElement.childNodes
  if x.NodeName = "to" then name=x.text
next

response.write(name)

Du kan læse meget mere her:
http://www.w3schools.com/dom/

//>Rune
Avatar billede arne_v Ekspert
18. september 2003 - 21:26 #8
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomTest6 {
  private final static String XML_FILE = "C:\\test.xml";
  public static void main(String[] args) {
      readXml(XML_FILE);
  }
  private static void readXml(String filename) {
      try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new File(filename));
        NodeList elements = doc.getElementsByTagName("event");
        for (int i = 0; i < elements.getLength(); i++) {
            Node element = elements.item(i);
            NamedNodeMap attrs = element.getAttributes();
            String id = attrs.getNamedItem("id").getNodeValue();
            String type = attrs.getNamedItem("type").getNodeValue();
            String date = element.getFirstChild().getNodeValue().replaceAll("\n","");
            System.out.println("INSERT INTO event VALUES(" + id + "," + type + ",'" + date + "')");
            NodeList subelements = element.getChildNodes();
            for(int j = 0; j < subelements.getLength(); j++) {
              if(subelements.item(j).getNodeName().equals("contestant")) {
                  NamedNodeMap subattrs = subelements.item(j).getAttributes();
                  String subid = subattrs.getNamedItem("id").getNodeValue();
                  String subcountry = subattrs.getNamedItem("country").getNodeValue();
                  String subname = subelements.item(j).getFirstChild().getNodeValue().replaceAll("\n","");
                  System.out.println("INSERT INTO contestant VALUES(" + subid + ",'" + subcountry + "','" + subname + "')");
                  NodeList subsubelements = subelements.item(j).getChildNodes();
                  for(int k = 0; k < subsubelements.getLength(); k++) {
                      if(subsubelements.item(k).getNodeName().equals("attrib")) {
                          NamedNodeMap subsubattrs = subsubelements.item(k).getAttributes();
                          String subsubid = subsubattrs.getNamedItem("id").getNodeValue();
                          String subsubtype = subsubattrs.getNamedItem("type").getNodeValue();
                          String subsubweight = subsubattrs.getNamedItem("weight").getNodeValue();
                          String subsubvalue = subsubelements.item(k).getFirstChild().getNodeValue().replaceAll("\n","");
                          System.out.println("INSERT INTO attrib VALUES(" + subsubid + "," + subsubtype + "," + subsubweight + "," + subsubvalue + ")");
                 
                      }
                  }
                 
              }
            }
        }
      } catch (FactoryConfigurationError e) {
        e.printStackTrace();
      } catch (ParserConfigurationException e) {
        e.printStackTrace();
      } catch (SAXException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return;
  }
}

giver output:

INSERT INTO event VALUES(2132,12,'2003-08-23')
INSERT INTO contestant VALUES(12345,'land','Groclin')
INSERT INTO attrib VALUES(14,100,2,1)
INSERT INTO attrib VALUES(23,200,2,16)
INSERT INTO attrib VALUES(16,100,4,12)
INSERT INTO attrib VALUES(500,300,1,1)
INSERT INTO contestant VALUES(67890,'land','Warhammer')
INSERT INTO attrib VALUES(34,100,1,4)
INSERT INTO attrib VALUES(25,100,3,6)

så logikken er god nok.

Du skal bare have et andet sprog !

:-)
Avatar billede arne_v Ekspert
18. september 2003 - 21:27 #9
Hm. Jeg mangler vist også at gemme foreign key i de to sidste tabeller.
Men det er nemt at tilføje.
Avatar billede medions Nybegynder
18. september 2003 - 21:45 #10
*G* Arne! -du er sq ik' helt på afveje med det Java :-D

//>Rune
Avatar billede arne_v Ekspert
27. september 2003 - 13:31 #11
Tid at lukke spørgsmålet eller spørge om mere ?
Avatar billede lumbye Nybegynder
28. september 2003 - 21:36 #12
Du har ret arne - den har hængt lidt længe nu. Dit Java-svar ser fornuftigt ud, men er ikke den teknologi der efterspørges. Derfor giver jeg ikke pointene.

Lukker og arbejder på en anden løsning i asp. Opretter nyt spørgsmål hvis der bliver behov for det...
Avatar billede lumbye Nybegynder
28. september 2003 - 21:37 #13
Lukker...
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
Kurser inden for grundlæggende programmering

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