Avatar billede bulgroz Nybegynder
16. december 2009 - 17:13 Der er 8 kommentarer og
1 løsning

<!DOCTYPE MyDocumentType SYSTEM " MyDocumentType.dtd">

Hej eksperter; Jeg skal opbygge et xml dokument som nedenstående (runtime) og har bla.a. brugt XmlDocument. Jeg har formået at specifere min linie indeholdende DOCTYPE, men jeg får en del tomme parametre med som støjer i nuværende scenarie.
Hvad er den rette metode til at oprette nedenstående xml dokument vha. kode?

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE MyDocumentType SYSTEM " MyDocumentType.dtd">
<MyRoot>
...
< /MyRoot >
Avatar billede arne_v Ekspert
16. december 2009 - 17:33 #1
Hvad giver:

            XmlDocument doc = new XmlDocument();
            doc.AppendChild(doc.CreateDocumentType("MyDocumentType", null, "MyDocumentType.dtd", null));
            doc.AppendChild(doc.CreateElement("MyRoot"));

?
Avatar billede bulgroz Nybegynder
17. december 2009 - 06:57 #2
Hmm. jeg ved ikke hvorfor jeg ikke fik det til at virke i første omgang, men svaret er fint.

Jeg får dog en compile fejl hvis dtd dokumentet ikke er til stede. Kan man komme udenom det? I mit scenarie specificerer stien et dokument på "backend" og valideringen foregår udelukkende på der. Jeg har med andre ord ikke nødvendigvis skemaerne liggende når jeg danner XmlDokumentet.
Avatar billede bulgroz Nybegynder
17. december 2009 - 07:06 #3
Sludder... jeg får ikke en compile fejl, men derimod en FileNotFoundException ;-)
Avatar billede arne_v Ekspert
17. december 2009 - 15:32 #4
proev med:

            XmlDocument doc = new XmlDocument();
            doc.XmlResolver = new MyXmlResolver();
            doc.AppendChild(doc.CreateDocumentType("MyDocumentType", null, "MyDocumentType.dtd", null));
            doc.AppendChild(doc.CreateElement("MyRoot"));

hvor:

    public class MyXmlResolver : XmlResolver
    {
        public override ICredentials Credentials { set { Credentials = value; } }
        public override Object GetEntity(Uri uri, string role, Type typ)
        {
            if(typeof(Stream).IsAssignableFrom(typ))
            {
                return new MemoryStream(new byte[0]);
            }
            else
            {
                return null;
            }
        }
    }
Avatar billede bulgroz Nybegynder
21. december 2009 - 10:05 #5
Nydeligt :-)

Mit sidste problem i denne omgang er at jeg med min XmlDeclaration konstant får <?xml version="1.0" encoding="utf-16"?> selvom jeg erklærer den som utf-8
           
XmlDeclaration xmlDeclaration = xmlDocument.CreateXmlDeclaration("1.0", Encoding.UTF8.WebName, null);
xmlDocument.AppendChild(xmlDeclaration);

Har du også en løsning / forklaring på dette?
Avatar billede arne_v Ekspert
21. december 2009 - 14:07 #6
Lad mig gaette. Du skriver til en StringWriter? Fordi string's altid er i UTF-16, saa bliver XML dokumenter skrevet til en saadan altid i UTF-16.

Problemet forsvinder af sig selv hvis du skriver direkte til en fil.
Avatar billede arne_v Ekspert
21. december 2009 - 14:11 #7
Jeg kender faktisk ikke nogen god workaround. Du kan naturligvis altid lave en simpel replace i strengen.
Avatar billede bulgroz Nybegynder
21. december 2009 - 14:14 #8
Du har ret. Det er heldigvis kun i mit eksempelkode at jeg bruger StringWriter, så egentligt er der ikke noget problem.

Tak for din hjælp... drop et svar
Avatar billede arne_v Ekspert
21. december 2009 - 14:21 #9
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

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