C# xml problem

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

C# xml problem

Post by semika » Sat Mar 12, 2005 10:13 pm

Εχω το εξής πρόβλημα:
Στο XmlDocument πάω να προσθέσω ένα XmlElement με την AppendChild.
Ενώ μου το προσθέτει κανονικά, μου βάζει και ένα XmlAttribute "xmlns" το οποίο δε μπορώ να βγάλω.

Εχει ασχοληθεί κανείς με το θέμα?

ΥΓ-> Ενώ τρέχω τα παραδείγματα της msdn βιβλιοθήκης, η AppendChild δεν εμφανίζει το "xmlns".

Pls help
Thanx in advance
User avatar
Skeftomilos
bit level
bit level
Posts: 43
Joined: Fri Mar 04, 2005 8:08 am
Location: Ν.Κόσμος

Post by Skeftomilos » Sun Mar 13, 2005 1:51 pm

Δοκίμασα το εξής ...

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>
Το συγκεκριμένο παράδειγμα δεν εμφάνισε την παρενέργεια που αναφέρεις.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Sun Mar 13, 2005 2:32 pm

Eυχαριστώ για την απάντηση :smile: . Το παράδειγμα που αναφέρεις είναι σε 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>

Εχετε καμμιά άλλη ιδέα?
User avatar
Einherjar
Venus Project Founder
Venus Project Founder
Posts: 3751
Joined: Tue Jan 27, 2004 4:42 pm
Academic status: Alumnus/a
Gender:
Location: Washington DC, USA
Contact:

Post by Einherjar » Sun Mar 13, 2005 3:19 pm

Αυτό το xmlns υποδεικνύει, αν θυμάμαι καλά, το τι είδους τιμή βάζεις. Θα έπρεπε να περιέχει ένα url προς το namespace που χρησιμοποιείται. δεν θυμάμαι αν είναι απαραίτητο πάντως.
[Better to understand a little than to misunderstand a lot]
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Sun Mar 13, 2005 3:31 pm

Thanx Einherjar, αλλά το πρόγραμμα που παίρνει ως είσοδο το παραπάνω xml δε δέχεται το xmlns στο συγκεκριμένο σημείο. Και το πρόβλημα είναι οτι δε μπορώ να το βγάλω..
User avatar
Skeftomilos
bit level
bit level
Posts: 43
Joined: Fri Mar 04, 2005 8:08 am
Location: Ν.Κόσμος

Post by Skeftomilos » Sun Mar 13, 2005 7:44 pm

Αντικατέστησε το ...

Code: Select all

XmlElement elem = docInit.CreateElement("price");
root.AppendChild(elem);
... με το ...

Code: Select all

root.InnerXml = "<price />";
XmlElement elem = root.FirstChild;
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Tue Mar 15, 2005 9:42 am

Αν και το έφτιαξα υπερφορτώνοντας μια άλλη μέθοδο, ευχαριστώ πολύ που μου απάντησες!

Και λέω για όσους τυχόν ενδιαφέρονται οτι όταν το Xm έχει xmlns μη-γνωστό τότε θεωρεί οτι πρέπει να ορίζεται σε κάθε tag. Αυτό που έκανα ήταν να βρώ το xmlns του root και να το προσθσέτω σε κάθε tag. Αν αυτά είναι τα ίδια, τότε δεν το βάζει στον κώδικα.
:cool:
User avatar
Skeftomilos
bit level
bit level
Posts: 43
Joined: Fri Mar 04, 2005 8:08 am
Location: Ν.Κόσμος

Post by Skeftomilos » Tue Mar 15, 2005 6:03 pm

Πολύ σωστό! Θα ορκιζόμουν ότι πρόκειται για bug του framework, αλλά φαίνεται ότι υπάρχει μέθοδος στην τρέλα τους. Η πρότασή μου ήταν βέβαια ένα quick & dirty hack και όχι μία λύση της προκοπής.
:)
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.
Post Reply

Return to “Προγραμματισμός”