How to get this XML tag?

  • Thread starter Thread starter Brett Romero
  • Start date Start date
B

Brett Romero

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
 
Brett Romero said:
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?
 
What do you mean? Do you mean when you save the DOM? The two are
equivalent.
 
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
 
Brett Romero said:
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?
 
As for context, I'm only creating an XMLDocument() type and filling it
with elements.

Brett
 
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
 
//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);
}
}
 
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
 
Brett Romero said:
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.
 
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
 
Brett Romero said:
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...
 
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
 
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).AppendChild(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
 
Brett Romero said:
Jon, I see the problem. I was trying to create things off of the
Declaration node, which I'm guessing you can't do.

I insert items into DataCollection by using:

this.ChildNodes.Item(1).ChildNodes.Item(2).AppendChild(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.
 
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
 
Brett Romero said:
Can you give a code example of what this means or how it can be used:

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);
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Back
Top