Avatar billede mungojerrie Nybegynder
14. februar 2005 - 15:19 Der er 9 kommentarer og
1 løsning

Samme XmlDocument på tværs af klasser

Hej
Har et lille problem med min XmlDocument instans.

Har en klasse hvor jeg instantierer den som en static

C#

Klasse 1:

protected static XmlDocument doc = new XmlDocument();

public static XmlDocument getXmlDocument(){
    XmlDocument doc = new XmlDocument();
    XmlDeclaration xmlDecl = doc.CreateXmlDeclaration("1.0", "iso-8859-1", null); //"iso-8859-1"
    doc.InsertBefore(xmlDecl, doc.DocumentElement);
    return doc;
}

klasse 2:

private static XmlDocument doc = klasse1.getXmlDocument();

public static XmlElement getNewXmlElement(string elementName, string stringValue)
{
    XmlElement element = doc.getXmlDocument().CreateElement(comPrepend, elementName, null);
    element.InnerText = stringValue;
    return element;
}

klasse test:

XmlDocument doc = klasse1.getXmlDocument();
XmlElement e = klasse2.getNewXmlElement("ReferencedOrder", "test");
doc.AppendChild(e);
doc.Save(Console.Out);

--------------------------
Ovenstående giver mig følgende fejl:

An unhandled exception of type 'System.ArgumentException' occurred in system.xml.dll

Additional information: Noden, der skal indsættes, kommer fra en anden dokumentkontekst.


Det kan jeg ikke helt forstå hvorfor.....
Avatar billede the_party_dog Nybegynder
14. februar 2005 - 15:24 #1
Hvorfor har du en proteced i din første klasse? Så vidt jeg kan se, bruger du den ikke..
Avatar billede the_party_dog Nybegynder
14. februar 2005 - 15:28 #2
I klasse 2, ville jeg ikke bruge: doc.getXmlDocument().CreateElement(comPrepend, elementName, null);

Der ville jeg bruge:
doc.CreateElement(comPrepend, elementName, null);
Avatar billede the_party_dog Nybegynder
14. februar 2005 - 15:30 #3
Går ud fra at du i din konstruktor til din klasse 2, får oprettet en instans af dit xml doc, fra din klasse 1.
Avatar billede the_party_dog Nybegynder
14. februar 2005 - 15:35 #4
class One
    {
        One()
        {

        }   

        public static XmlDocument getXmlDocument()
        {
            XmlDocument doc = new XmlDocument();
            XmlDeclaration xmlDecl = doc.CreateXmlDeclaration("1.0", "iso-8859-1", null); //"iso-8859-1"
            doc.InsertBefore(xmlDecl, doc.DocumentElement);
            return doc;
        }
    }

    class Two
    {
        private static XmlDocument doc = One.getXmlDocument();

        Two()
        {
           
        }

        public static XmlElement getNewXmlElement(string elementName, string stringValue)
        {
            XmlElement element = doc.CreateElement(elementName);
            element.InnerText = stringValue;
            return element;
        }

    }
Avatar billede the_party_dog Nybegynder
14. februar 2005 - 15:35 #5
prøv det
Avatar billede mungojerrie Nybegynder
14. februar 2005 - 15:46 #6
Beklager det er mig der har lavet en skrive fejl mht min klasse 2's getNewXmlElement metode, der skriver jeg også
public static XmlElement getNewXmlElement(string elementName, string stringValue)
{
    XmlElement element = doc.CreateElement(comPrepend, elementName, null);
    element.InnerText = stringValue;
    return element;
}

mht din kommentar:
"Går ud fra at du i din konstruktor til din klasse 2, får oprettet en instans af dit xml doc, fra din klasse 1."
så nej, jeg laver jo en pegepind til xmldocument'et i min klasse 1 fremfor at instantiere den
Avatar billede mungojerrie Nybegynder
15. februar 2005 - 10:24 #7
har fundet fejlen :-)

smid et svar hvis du vil ha point
Avatar billede the_party_dog Nybegynder
16. februar 2005 - 07:58 #8
Hvis jeg ikke har hjulpet dig med noget, vil jeg da ikke have points :) Men vil gerne vide hvad din fejl var? Er frisk på at lære noget nyt :)
Avatar billede mungojerrie Nybegynder
18. februar 2005 - 10:00 #9
okay, jeg havde lavet en fejl i min første metode:

public static XmlDocument getXmlDocument(){
    XmlDocument doc = new XmlDocument(); // skal jo ikke "new'e" den da den allerede er blevet instatieret ovenfor af denne linje:
protected static XmlDocument doc = new XmlDocument();

Desuden var der også fejl i den anden metode:
public static XmlElement getNewXmlElement(string elementName, string stringValue)
{
    XmlElement element = doc.getXmlDocument().CreateElement(comPrepend, elementName, null); // skal jo ikke sige "doc.getXmlDocument()
Avatar billede the_party_dog Nybegynder
18. februar 2005 - 10:58 #10
Kunne heller ikke helt se hvorfor du gjorde som du gjorde... Gider du poste din endelig kode? Så jeg lige kan se hvordan det hele se ud sammen. Det ville være rart :)
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