471,337 Members | 1,102 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,337 software developers and data experts.

How to get this XML tag?

Rather than this type of tag:

<File Type="Criteria">
</File>

How can I get this:

<File Type="Criteria" />

I only need the closing tag if there will be elements or children
inserted there.

Thanks,
Brett

Feb 2 '06 #1
16 1536
Brett Romero <ac*****@cygen.com> wrote:
Rather than this type of tag:

<File Type="Criteria">
</File>

How can I get this:

<File Type="Criteria" />

I only need the closing tag if there will be elements or children
inserted there.


Could you tell us a bit more about the context? Are you trying to read
the XML, write it, what?

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Feb 2 '06 #2
What do you mean? Do you mean when you save the DOM? The two are
equivalent.

"Brett Romero" <ac*****@cygen.com> wrote in message
news:11*********************@z14g2000cwz.googlegro ups.com...
Rather than this type of tag:

<File Type="Criteria">
</File>

How can I get this:

<File Type="Criteria" />

I only need the closing tag if there will be elements or children
inserted there.

Thanks,
Brett

Feb 2 '06 #3
In C#, when I create an element, it always throws in the closing tag,
which I don't want. The backslash in the opening tag is a shortcut,
which is what I want.

Brett

Feb 2 '06 #4
Brett Romero <ac*****@cygen.com> wrote:
In C#, when I create an element, it always throws in the closing tag,
which I don't want. The backslash in the opening tag is a shortcut,
which is what I want.


Again, please say exactly what context this is in. How are you creating
the element? How are you then formatting the document?

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Feb 2 '06 #5
As for context, I'm only creating an XMLDocument() type and filling it
with elements.

Brett

Feb 2 '06 #6
Once again Google Groups is eating my posts. Here's another try:

I create an XMLDocument() object. I give it the root node and add
elements. When I do xmldoc.Save(filename), the file will look like
this:

<?xml version="1.0"?>
<ROOT>
<Person PersonId="100">
</Person>
</ROOT>

Here's my code, which is in a class extending XMLDocument(). That's
why you see the reference to "this":

private XmlDocument xmldoc = new XmlDocument();
private string rootNodeName = "ROOT";
private XmlNode xmlnode;
private XmlElement xmlelem;
private XmlElement xmlelem2;
private XmlText xmltext;

//This is in a method
xmlnode=this.CreateNode(XmlNodeType.XmlDeclaration ,"","");
this.AppendChild(xmlnode);
//add the root element
xmlelem=this.CreateElement("",rootNodeName,"");
xmltext=this.CreateTextNode("");
xmlelem.AppendChild(xmltext);
this.AppendChild(xmlelem);

//This is in a method
//add another element (child of the root)
xmlelem2=this.CreateElement("","Person","");
XmlAttribute atrXML = xmldoc.CreateAttribute("PersonId");
atrXML.Value = "100";
xmlelem2.SetAttributeNode(atrXML);
xmlelem2.AppendChild(xmltext);
this.ChildNodes.Item(1).AppendChild(xmlelem2);

I'm passing variables to each of the methods but hard coded values for
simplicity.

Hope that helps and this post.

Thanks,
Brett

Feb 2 '06 #7
Brett Romero <ac*****@cygen.com> wrote:

<snip>
//This is in a method
//add another element (child of the root)
xmlelem2=this.CreateElement("","Person","");
XmlAttribute atrXML = xmldoc.CreateAttribute("PersonId");
atrXML.Value = "100";
xmlelem2.SetAttributeNode(atrXML);
xmlelem2.AppendChild(xmltext);
this.ChildNodes.Item(1).AppendChild(xmlelem2);


The problem is that you're appending an empty text node. If you get rid
of xmlelem2.AppendChild(xmltext); then it works fine.

Here's a short but complete example program:

using System;
using System.Xml;

class Test
{
static void Main()
{
XmlDocument doc = new XmlDocument();

doc.AppendChild(doc.CreateNode
(XmlNodeType.XmlDeclaration,"",""));
XmlElement root = doc.CreateElement ("", "ROOT", "");
XmlText text = doc.CreateTextNode ("");
root.AppendChild(text);
doc.AppendChild(root);

XmlElement person = doc.CreateElement ("", "Person", "");
XmlAttribute attr = doc.CreateAttribute ("PersonId");
attr.Value = "100";
person.SetAttributeNode (attr);
// Uncomment this line to get the "broken" behaviour
// person.AppendChild(text);
root.AppendChild(person);

doc.Save(Console.Out);
}
}

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Feb 2 '06 #8
Perfect!

How do I add a nested node? For example, if I want to get this
structure:

<ROOT>
<File Type="Criteria" />
<Search Type="Person" Name="My Search" />
<CriteriaCollection >
<Person FirstName="Brett" LastName="Rom" />
<Person FirstName="Jon" LastName="Do" />
</CriteriaCollection>
</ROOT>

Where CriteriaCollection contains another node(?) named Person.

Thanks,
Brett

Feb 2 '06 #9
Brett Romero <ac*****@cygen.com> wrote:
Perfect!

How do I add a nested node? For example, if I want to get this
structure:

<ROOT>
<File Type="Criteria" />
<Search Type="Person" Name="My Search" />
<CriteriaCollection >
<Person FirstName="Brett" LastName="Rom" />
<Person FirstName="Jon" LastName="Do" />
</CriteriaCollection>
</ROOT>

Where CriteriaCollection contains another node(?) named Person.


Create the CriteriaCollection element and append that as a child of the
root element. Then create the Person element and append that as a child
of the CriteriaCollection element.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Feb 2 '06 #10
Do you have a code example of how that is done? I can't get the Person
node to go.

this.ChildNodes.Item(index).AppendChild(xmlelem2);

ROOT has been created. CriteriaCollection has also been created
successfully. Doesn't the index go from 0 on? When I added
CriteriaCollection, I used an index of 1. Shouldn't the next index be
2...for Person? When I try that, I get:

Object reference not set to an instance of object.

Thanks,
Brett

Feb 3 '06 #11
Brett Romero <ac*****@cygen.com> wrote:
Do you have a code example of how that is done? I can't get the Person
node to go.

this.ChildNodes.Item(index).AppendChild(xmlelem2);

ROOT has been created. CriteriaCollection has also been created
successfully. Doesn't the index go from 0 on? When I added
CriteriaCollection, I used an index of 1. Shouldn't the next index be
2...for Person? When I try that, I get:

Object reference not set to an instance of object.


You've *created* CriteriaCollection, but have you appended it yet?
Without seeing your code, it's hard to say...

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Feb 3 '06 #12
Yes - of which I said an index value of 1 was used:

this.ChildNodes.Item(1).AppendChild(xmlelem2);

where xmlelem2 contains the CriteriaCollection node.

Thanks,
Brett

Feb 3 '06 #13
Jon, I see the problem. I was trying to create things off of the
Declaration node, which I'm guessing you can't do.

Here's the finished product:

<?xml version="1.0"?>
<ROOT>
<File Type="Criteria" />
<DataCollection>
<Person FirstName="brett" />
</DataCollection>
</ROOT>

I insert items into DataCollection by using:

this.ChildNodes.Item(1).ChildNodes.Item(2).AppendC hild(xmlelem);

However, I can't always be sure DataCollection will be at 2 in the tree
structure. Is there a way to reference it by name instead of index?

Also, <File Type="Criteria" /> is an "Element" of ROOT, not a node.
Yet it pushes DataCollection down to index 2. Shouldn't DataCollection
be the first index off of ROOT? After all, I am saying ChildNodes,
which really shouldn't include elements.

Thanks,
Brett

Feb 3 '06 #14
Brett Romero <ac*****@cygen.com> wrote:
Jon, I see the problem. I was trying to create things off of the
Declaration node, which I'm guessing you can't do.
<snip>
I insert items into DataCollection by using:

this.ChildNodes.Item(1).ChildNodes.Item(2).AppendC hild(xmlelem);

However, I can't always be sure DataCollection will be at 2 in the tree
structure. Is there a way to reference it by name instead of index?
You could use an XPath expression - but wouldn't it be easier just to
keep a reference to the element you created?
Also, <File Type="Criteria" /> is an "Element" of ROOT, not a node.
Well, every element is a node. Look at the type hierarchy for
XmlElement...
Yet it pushes DataCollection down to index 2. Shouldn't DataCollection
be the first index off of ROOT? After all, I am saying ChildNodes,
which really shouldn't include elements.


Yes it should - see above.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Feb 3 '06 #15
Can you give a code example of what this means or how it can be used:

You could use an XPath expression - but wouldn't it be easier just to
keep a reference to the element you created?

Thanks,
Brett

Feb 3 '06 #16
Brett Romero <ac*****@cygen.com> wrote:
Can you give a code example of what this means or how it can be used:
You could use an XPath expression - but wouldn't it be easier just to
keep a reference to the element you created?


I mean that at *some* point you're creating the DataCollection element.
Save a reference to it in a variable (like you've currently got for
xmlelem and xmlelem2). Then you just need to call
dataCollectionElement.AppendChild(personElement);

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Feb 3 '06 #17

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

3 posts views Thread by William C. White | last post: by
2 posts views Thread by Albert Ahtenberg | last post: by
3 posts views Thread by James | last post: by
reply views Thread by Ollivier Robert | last post: by
1 post views Thread by Richard Galli | last post: by
4 posts views Thread by Albert Ahtenberg | last post: by
1 post views Thread by inderjit S Gabrie | last post: by
2 posts views Thread by Jack | last post: by
3 posts views Thread by Sandwick | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.