Avatar billede wwwbolig Nybegynder
17. april 2002 - 11:15 Der er 12 kommentarer

Sammensmelt to XML dokumenter

Hejsa

Jeg har et XML dokument som beskriver en indtastningsblanket til personoplysninger:

<personer>
<person>
  <navn>
  <indtastningsfelt id="fornavn"/>
  <indtastningsfelt navn id="efternavn"/>
  </navn>
  <adresse>
  <indtastningsfelt id="vej"/>
  </adresse>
</person>
</personer>


De indtastede oplysninger bliver gemt i et andet XML dokument:

<personer>
<person>
  <indtastningsfelt-vaerdier>
    <fornavn><![CDATA[John]]></fornavn1>
    <efternavn1><![CDATA[Doe]]></efternavn1>
    <vej><![CDATA[Acmeroad]]></vej1>
  </indtastningsfelt-vaerdier>
</person>
</personer>

Mit spørgsmål er nu hvordan jeg kan sammemsmelte de to dokumenter til:

<personer>
<person>
  <navn>
  <indtastningsfelt id="fornavn"><![CDATA[John]]</indtastningsfelt>
  <indtastningsfelt navn id="efternavn"><![CDATA[Doe]]></indtastningsfelt>
  </navn>
  <adresse>
  <indtastningsfelt id="vej"><![CDATA[Acmeroad]]></indtastningsfelt>
  </adresse>
</person>
</personer>

hvordan gøres dette? - håber nogen kan hjælpe..
Avatar billede nute Nybegynder
17. april 2002 - 11:20 #1
hva bruker du for å manipulere xml dokumentet med ?
Avatar billede wwwbolig Nybegynder
17. april 2002 - 11:25 #2
Hej Nute

Applikationen jeg brugere det i, er en ASP.NET applikation. Men tror at man skal bruge noget XSL transformation til dette elller??
Avatar billede nute Nybegynder
17. april 2002 - 11:34 #3
klarer du å lese verdiene ut fra hver av disse dokumenter ? så det eneste du trenger hjelp til er å legge data fra det ene dokument til i det andre ?
Avatar billede wwwbolig Nybegynder
17. april 2002 - 11:41 #4
Jeg havde tænkt på om man kunne læse de to dokumenter ind i to XMLDocument objekter og så transformere dem til et tredje XMLDocument via XSLT?
Avatar billede nute Nybegynder
17. april 2002 - 12:00 #5
nja...det behøver du jo egentlig ikke. Det er jo selvfølgelig mange muligheter. Du kan jo bygge et nytt XML dokument inne i din klasse, du kan legge verdier til ditt allerede eksisterende XML dokument eller du kan benytte XSLT (selv om jeg ikke synes det høres ut som en god løsning...)

Jeg ville nok brukt mitt forslag nummer 2...lese igjennom ditt 'incoming' XML dokument og legge verdiene til i ditt andre dokument.

noe ála:

XmlDocument oldXmlDoc = [det xml doc. du skal leggew verdier inn i];

XmlDocument newXmlDoc = [ditt nye xml dokument];
XmlNode rootNode = newXmlDoc.FirstChild;
XmlElement elem;
           
  if( rootNode.HasChildNodes ){
    String tmpNodeName;
    String strFornavn, strEfternavn, strVej;

    for( int i = 0; i < rootNode.ChildNodes.Count; i++ ){
      tmpNodeName = rootNode.ChildNodes[i].Name;

      if( tmpNodeName == "fornavn" ){
    elem = (XmlElement)rootNode.ChildNodes[i];
        strFornavn = elem.InnerText;
      }
      if( tmpNodeName == "efternavn" ){
    elem = (XmlElement)rootNode.ChildNodes[i];
        strEfternavn = elem.InnerText;
      }
      if( tmpNodeName == "vej" ){
    elem = (XmlElement)rootNode.ChildNodes[i];
        strVej = elem.InnerText;
      }
    }

    // Parser igjennom hoveddokument
    rootNode = newXmlDoc.FirstChild;

    if( rootNode.HasChildNodes ){
      String attrib;
      for( int i = 0; i < rootNode.ChildNodes.Count; i++ ){
        elem = (XmlElement)rootNode.ChildNodes[i];
        attrib = elem.Attributes["id"].Value;
       
        if( attrib == "fornavn" ){
          elem.InnerText = strFornavn;
        }
        if( attrib == "efternavn" ){
          elem.InnerText = strEfternavn;
        }
        if( attrib == "vej" ){
          elem.InnerText = strVej;
        }
      }
    }

PS! dette er overhodet ikke testet, men jeg håper det gir deg et lite hint til hvordan det kan løses...
Avatar billede wwwbolig Nybegynder
17. april 2002 - 12:34 #6
Hej Nute

Det ser godt ud, dit eksempel. Men jeg ville meget gerne have en mere generel løsning da nedenstående xml helt sikkert bliver udvidet med flere indtastningsfelter og dermed bliver også resultat XML dokumentet ændret.  Og vil ikke kode nyt ved ændringer i XML'en.

<personer>
<person>
  <navn>
  <indtastningsfelt id="fornavn"/>
  <indtastningsfelt navn id="efternavn"/>
  </navn>
  <adresse>
  <indtastningsfelt id="vej"/>
  </adresse>
</person>
</personer>
Avatar billede nute Nybegynder
17. april 2002 - 12:40 #7
nei...jeg ville vel gjort det på en litt annen  måte selv når jeg tenker meg litt om...

jeg ville nok gjort noe ála:

String strVal;

for( int i = 0; i < rootNode.ChildNodes.Count; i++ ){
      tmpNodeName = rootNode.ChildNodes[i].Name;
      elem = (XmlElement)rootNode.ChildNodes[i];
      strVal = rootNode.ChildNodes[i].InnerText;
   
      elem = oldXmlDoc.GetElementById( tmpNodeName );
      elem.InnerText = strVal;
}

Igjen...det er ikke testet, men jeg skisserer kun idéen, da jeg ikke har tid til å utprøve ordentlig...
Avatar billede wwwbolig Nybegynder
17. april 2002 - 12:52 #8
fino - jeg kigger på det lidt senere idag :-)
Avatar billede Slettet bruger
17. april 2002 - 14:05 #9
Jeg ville helt klart vælge XSLT løsningen, da "formlen" for sammensmeltning så kommer til at ligge i en separat let-forståelig (XML-) fil...

/CS
Avatar billede nute Nybegynder
17. april 2002 - 14:11 #10
greystate >> "let-forståelig" ... det kommer jo an på for hvem det skal være forståelig for ;-)

Nå skal jeg innrømme at jeg ikke er den største xsl hai, men jeg synes det virker som litt smør på flesk (for å si det på norsk) å skulle "ut av klassen" for å utføre en operasjon som helt klart kan utføres mye hurtigere inne i selve klassen.

Eneste fordelen jeg kan se med det er at det er "enklere" å endre utseende av det ferdige dokument, men kun i den grad at man slipper å kompilere.  Men hvis man bygger et script til å kompilere for seg, så er jo heller ikke det noe problem...
Avatar billede wwwbolig Nybegynder
17. april 2002 - 15:33 #11
greystate >> da jeg er helt blank med hensyn til at bruge XSLT løsningen, kan du så lige hjælpe mig lidt igang på ovenstående problem?

Har tænkt mig at prøve begge løsninger.
Avatar billede Slettet bruger
17. april 2002 - 19:54 #12
XML: "exp199380-format.xml"
----------------------------
<personer>
    <person>
        <navn>
            <indtastningsfelt id="fornavn"/>
            <indtastningsfelt id="efternavn"/>
        </navn>
        <adresse>
            <indtastningsfelt id="vej"/>
        </adresse>
    </person>
</personer>

XML: "exp199380-data.xml"
-------------------------
<personer>
    <person>
        <indtastningsfelt-vaerdier>
            <fornavn><![CDATA[John]]></fornavn>
            <efternavn><![CDATA[Doe]]></efternavn>
            <vej><![CDATA[Acmeroad]]></vej>
        </indtastningsfelt-vaerdier>
    </person>
</personer>

XSLT "exp199380-transform.xsl:
------------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"
    cdata-section-elements="indtastningsfelt"
/>

    <xsl:param name="datadoc">exp199380-data.xml</xsl:param>
   
    <xsl:variable name="data" select="document($datadoc)//personer" />
   
    <xsl:template match="/">
        <xmp>
            <xsl:apply-templates select="personer" />
        </xmp>
    </xsl:template>
   
    <xsl:template match="personer">
        <personer>
            <xsl:apply-templates select="person" />
        </personer>
    </xsl:template>
   
    <xsl:template match="person">
        <xsl:apply-templates select="navn" />
        <xsl:apply-templates select="adresse" />
    </xsl:template>
   
    <xsl:template match="navn | adresse">
        <xsl:element name="{name()}">
            <xsl:apply-templates select="indtastningsfelt" />
        </xsl:element>
    </xsl:template>
   
    <xsl:template match="indtastningsfelt">
        <indtastningsfelt id="{@id}">
            <xsl:value-of select="$data//person/indtastningsfelt-vaerdier/*[name() = current()/@id]" />
        </indtastningsfelt>
    </xsl:template>
   
</xsl:stylesheet>

Stylesheet'et bruges på "-format" filen, og en parameter i stylesheet'et bestemmer hvilken datafil der benyttes. Denne parameter tænkes selvfølgelig ændret udefra...

/CS
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