Avatar billede dl Nybegynder
30. maj 2008 - 15:16 Der er 13 kommentarer og
1 løsning

XML manipulering via XSD

Jeg har et XML dokument som jeg skal have tilføjet, slettet, og ændret nogle elementer incl. attributter og ROOT-noden.

jeg har dette XML dokument ->

<a_b_c>
  <g></g>
  <j></j>
  <k>
    <l></l>
    <p></p>
  </k>
  ...
</a_b_c>


som jeg skal have converteret til

<a attribut="yes">
  <g></g>
  <k>
    <l></l>
    <p></p>
  </k>
</a>


Jeg har læst mig til at et diffgram burde kunne løse dette problem.
Men jeg har nu mågget med dette i timevis, og søgt efter eksempler  på google og msdn. Ingen held.

Når jeg konverter, så skal jeg også værdierne med over.

Det er heller ikke sikkert at alle elementer har samme navn.

//dl

ps. artiklerne og hjælpen må gerne være for dummyes. Eftersom jeg mit hoved er brændt sammen. :)
Avatar billede arne_v Ekspert
31. maj 2008 - 05:26 #1
xsd er et skema som beskriver XML

xsl er et stylesheet som formaterer/konverterer XML

men jeg tror at en helt normal manipulation af DOM er nemmere end XSLT

eksempel:

using System;
using System.Xml;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(@"C:\abc.xml");
            XmlDocument doc2 = new XmlDocument();
            doc2.AppendChild(doc2.CreateElement("a"));
            doc2.DocumentElement.Attributes.Append(doc2.CreateAttribute("attribut"));
            doc2.DocumentElement.Attributes["attribut"].Value = "yes";
            foreach(XmlNode n in doc.DocumentElement.ChildNodes)
            {
                if(n.Name != "j")
                {
                    doc2.DocumentElement.AppendChild(doc2.ImportNode(n, true));
                }
            }
            doc2.Save(@"C:\a.xml");
        }
    }
}
Avatar billede dl Nybegynder
02. juni 2008 - 09:35 #2
ud fra dette, kan jeg se at det må være xls jeg skal bruge.

Jeg har også lavet et lille eksempel:

Xml:

<?xml-stylesheet type="text/xsl" href="skema.xsl"?>
<books>
  <book publisher="IDG books" on-loan="Sanjay">
    <title>XML Bible</title>
    <author>Elliotte Rusty Harold</author>
  </book>
  <book publisher="Addison-Wesley">
    <title>The Mythical Man Month</title>
    <author>Frederick Brooks</author>
  </book>
  <book publisher="WROX">
    <title>Professional XSLT 2nd Edition</title>
    <author>Michael Kay</author>
  </book>
  <book publisher="Prentice Hall" on-loan="Sander" >
    <title>Definitive XML Schema</title>
    <author>Priscilla Walmsley</author>
  </book>
  <book publisher="APress">
    <title>A Programmer's Introduction to C#</title>
    <author>Eric Gunnerson</author>
  </book>
</books>

xsl:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <root>
      <xsl:for-each select="books/book">
        <title><xsl:value-of select="title"/></title>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>



Det sjove er: at hvis jeg køre dette i VS 2008 intern browser, så viser den ingen data, men ser jeg på kilden, så formatere den alle data som den skal. Hvorfor det ?

Hvis det derefter prøver på en extern browser (IE), så viser den ingen ting. Men ser jeg på kilden, så får jeg den originale xml smit i hovedet. Hvorfor det ?

Derudover køre jeg i encodning UTF-8,  men når jeg ser på den formatere kilde xml, i den interne browser i VS, så står der UTF-16.  hvorfor det ?
Avatar billede dl Nybegynder
02. juni 2008 - 13:14 #3
Det skal dog lige siges, at jeg skal formatere fra et XML dokument til et andet.
Hvor der i denne process, er nogle små ændringer i name og attributter.
Avatar billede dl Nybegynder
03. juni 2008 - 10:43 #4
Kan man overhovedet dette ?

Synes snart jeg har læst så meget på det, at mener man ikke kan.

Eller er jeg forkert på den `.
Avatar billede arne_v Ekspert
04. juni 2008 - 04:12 #5
Browsere er normalt ret dårlig værktøjer til at arbejde med XSLT.

Show source skal være den originale XML (når det er client side XSLT).

----

Ja - XSLT kan sagtens ændre på elementer og attributter.

Men det er ikke nødvendigvis altid nemmere end bare at kode det.
Avatar billede dl Nybegynder
04. juni 2008 - 09:07 #6
Hvis jeg nu har et  XML dokument som ser sådan her ud:

XML::

<?xml version="1.0" encoding="utf-8"?>
<history>
  <process_status>0</process_status>
  <header_general>
    <document_number>123456</document_number>
    <order_date>20080404<order_date>
    <shipping_method>post</shipping_method>
  </header_general>
<history>


Hvordan får jeg lavet dette om til :

<?xml version="1.0" encoding="utf-8"?>
<cp_history xmins="urn:123.xml">
  <process_status>0</process_status>
  <header_general>
    <document_number>123456</document_number>
    <order_date>20080404<order_date>
  </header_general>
<cp_history>


Vil du ikke give et eksempel på dette?
mit dokument er meget større, men dette er en lille del af det, sådan da.

Jeg kan bruge eksempel til at få skrevet resten selv :)  jeg har menlig forsøgt en dag eller to og løse problemmet med XSLT, men kan bare ikke få det igemmen.
Avatar billede dl Nybegynder
04. juni 2008 - 09:15 #7
Det ville hjælpe så meget :)
Avatar billede dl Nybegynder
04. juni 2008 - 09:46 #8
Og hvor order_date bare hedder  <orderdata>20080404</orderdata>
Avatar billede arne_v Ekspert
05. juni 2008 - 04:12 #9
Først skal din XML lige fixes:

<?xml version="1.0" encoding="utf-8"?>
<history>
  <process_status>0</process_status>
  <header_general>
    <document_number>123456</document_number>
    <order_date>20080404</order_date>order_date>
    <shipping_method>post</shipping_method>
  </header_general>
</history>
Avatar billede arne_v Ekspert
05. juni 2008 - 04:13 #10
om igen:

<?xml version="1.0" encoding="utf-8"?>
<history>
  <process_status>0</process_status>
  <header_general>
    <document_number>123456</document_number>
    <order_date>20080404</order_date>
    <shipping_method>post</shipping_method>
  </header_general>
</history>
Avatar billede arne_v Ekspert
05. juni 2008 - 04:18 #11
Prøv med følgende XSL:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
<cp_history>
<xsl:apply-templates/>
</cp_history>
</xsl:template>

<xsl:template match="process_status">
<xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="header_general">
<header_general>
<xsl:apply-templates/>
</header_general>
</xsl:template>

<xsl:template match="document_number">
<xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="order_date">
<orderdata>
<xsl:value-of select="."/>
</orderdata>
</xsl:template>

<xsl:template match="shipping_method">
</xsl:template>

</xsl:stylesheet>
Avatar billede dl Nybegynder
06. juni 2008 - 12:39 #12
Tak, arne_v.

Hvis du lige vil komme med et svar.

Måske du lige kunne lufte et guldkorn, hvor jeg få loadet det ind i et XmlDocument.
Da det xml som er loadet ind, ikke indeholder en ref til XSLT.

//dl
Avatar billede dl Nybegynder
06. juni 2008 - 13:50 #13
Har fundet ud af det  :)  bare kom med et svar.
Avatar billede arne_v Ekspert
06. juni 2008 - 15:07 #14
svar
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