Page 1 of 1
C# xml problem
Posted: Sat Mar 12, 2005 10:13 pm
by semika
Εχω το εξής πρόβλημα:
Στο XmlDocument πάω να προσθέσω ένα XmlElement με την AppendChild.
Ενώ μου το προσθέτει κανονικά, μου βάζει και ένα XmlAttribute "xmlns" το οποίο δε μπορώ να βγάλω.
Εχει ασχοληθεί κανείς με το θέμα?
ΥΓ-> Ενώ τρέχω τα παραδείγματα της msdn βιβλιοθήκης, η AppendChild δεν εμφανίζει το "xmlns".
Pls help
Thanx in advance
Posted: Sun Mar 13, 2005 1:51 pm
by Skeftomilos
Δοκίμασα το εξής ...
Code: Select all
Imports System.Xml
Imports System.IO
Module Module1
Sub Main()
Dim oDocument As XmlDocument
Dim oDeclaration As XmlNode
Dim oNode As XmlNode
Dim oWriter As TextWriter
oDocument = New XmlDocument()
oDeclaration = oDocument.CreateXmlDeclaration("1.0", Nothing, Nothing)
Call oDocument.AppendChild(oDeclaration)
oNode = oDocument.CreateElement("Customers")
oNode.InnerText = "Hello"
Call oDocument.AppendChild(oNode)
oWriter = New StringWriter()
Call oDocument.Save(oWriter)
MsgBox(oWriter.ToString())
End Sub
End Module
... και πήρα το εξής ...
<?xml version="1.0" encoding="utf-16"?>
<Customers>Hello</Customers>
Το συγκεκριμένο παράδειγμα δεν εμφάνισε την παρενέργεια που αναφέρεις.
Posted: Sun Mar 13, 2005 2:32 pm
by semika
Eυχαριστώ για την απάντηση

. Το παράδειγμα που αναφέρεις είναι σε vb.net οχι σε c#.
Αυτό που θέλω να κάνω είναι να διαβάσω ένα αρχείο
τύπου xml και να εντοπίζω κάποια Elements και στη συνέχεια να τους προσθέτω παιδιά AppendChild. Λέω "τύπου" γιατί είναι xml που έχει γραφτεί για ένα άλλο πρόγραμμα που παίρνει ως είσοδο τέτοιου είδους αρχεία.
Εστω το αρχείο εισόδου:
Code: Select all
<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
<Product Id="7B267631-0F4B-40C8-8025-CFEA43F8C3A5">
<Package Id="85722C83-EA10-4C3B-AC2E-71DFCF196B58"/>
<Media Id="1" Cabinet="Data.cab" EmbedCab="yes"/>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="bin" Name="bin">
</Directory>
</Directory>
</Directory>
</Product>
</Wix>
Θέλω κάτω από το τελευταίο <Directory>
να προσθέσω ένα tag <price/>
Code: Select all
XmlDocument docInit = new XmlDocument();
docInit.CreateXmlDeclaration("1.0", null, null);
docInit.Load("input.xml");
//.....βρίσκω το κατάλληλο tag και το λέω root.....
XmlElement elem = docInit.CreateElement("price");
root.AppendChild(elem);
Τελικά κάνει το εξής:
Code: Select all
<Directory Id="bin" Name="bin">
<price xmlns="" />
</Directory>
Εχετε καμμιά άλλη ιδέα?
Posted: Sun Mar 13, 2005 3:19 pm
by Einherjar
Αυτό το xmlns υποδεικνύει, αν θυμάμαι καλά, το τι είδους τιμή βάζεις. Θα έπρεπε να περιέχει ένα url προς το namespace που χρησιμοποιείται. δεν θυμάμαι αν είναι απαραίτητο πάντως.
Posted: Sun Mar 13, 2005 3:31 pm
by semika
Thanx Einherjar, αλλά το πρόγραμμα που παίρνει ως είσοδο το παραπάνω xml δε δέχεται το xmlns στο συγκεκριμένο σημείο. Και το πρόβλημα είναι οτι δε μπορώ να το βγάλω..
Posted: Sun Mar 13, 2005 7:44 pm
by Skeftomilos
Αντικατέστησε το ...
Code: Select all
XmlElement elem = docInit.CreateElement("price");
root.AppendChild(elem);
... με το ...
Code: Select all
root.InnerXml = "<price />";
XmlElement elem = root.FirstChild;
Posted: Tue Mar 15, 2005 9:42 am
by semika
Αν και το έφτιαξα υπερφορτώνοντας μια άλλη μέθοδο, ευχαριστώ πολύ που μου απάντησες!
Και λέω για όσους τυχόν ενδιαφέρονται οτι όταν το Xm έχει xmlns μη-γνωστό τότε θεωρεί οτι πρέπει να ορίζεται σε κάθε tag. Αυτό που έκανα ήταν να βρώ το xmlns του root και να το προσθσέτω σε κάθε tag. Αν αυτά είναι τα ίδια, τότε δεν το βάζει στον κώδικα.

Posted: Tue Mar 15, 2005 6:03 pm
by Skeftomilos
Πολύ σωστό! Θα ορκιζόμουν ότι πρόκειται για bug του framework, αλλά φαίνεται ότι υπάρχει μέθοδος στην τρέλα τους. Η πρότασή μου ήταν βέβαια ένα quick & dirty hack και όχι μία λύση της προκοπής.
