Question on arrays (newbie)

A

alexseys

I am trying to rewrite a vbs script in c# that collects data from a pc and writes it into an xml file
I have figured out how to write the file with data in an array. Smple of code below.
But that seems quite inefficient considering I have to collect many many properties for different items
The number of elements will differ from item to item
Does anyone have an idea on how to create a function that will write xml file without explicit knowlege what is inside if an array?
Thank You for your help
alexseys

XmlTextWriter bankWriter = null;
bankWriter = new XmlTextWriter("c:\\test1.xml", null);
bankWriter.Formatting = Formatting.Indented;
bankWriter.Indentation = 6;
bankWriter.Namespaces = false;
bankWriter.WriteStartDocument();
bankWriter.WriteStartElement("computer");
comp.GetDiskDrive();
foreach (Disk disk in comp.disks)
{
bankWriter.WriteStartElement("component");
bankWriter.WriteStartElement("type");
bankWriter.WriteString("Hard Disk");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("name");
bankWriter.WriteString(disk.caption);
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Manufacturer");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteString(disk.Manufacturer);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Size");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(disk.size);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Interface");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(disk.InterfaceType);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
}

foreach (Memory memchip in comp.memchips)
{
bankWriter.WriteStartElement("component");
bankWriter.WriteStartElement("type");
bankWriter.WriteString("Physical Memory");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("name");
bankWriter.WriteString(memchip.Caption);
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("PositionInRow");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteString(memchip.PositionInRow);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Capacity");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(memchip.Capacity);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("FormFactor");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(memchip.FormFactor);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
}

bankWriter.WriteEndDocument();
bankWriter.Flush();
 
L

Laura T.

Check if the XmlSerializer could work in your case:

http://msdn2.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

"alexseys" <[email protected]> ha scritto nel messaggio I am trying to rewrite a vbs script in c# that collects data from a pc and writes it into an xml file
I have figured out how to write the file with data in an array. Smple of code below.
But that seems quite inefficient considering I have to collect many many properties for different items
The number of elements will differ from item to item
Does anyone have an idea on how to create a function that will write xml file without explicit knowlege what is inside if an array?
Thank You for your help
alexseys

XmlTextWriter bankWriter = null;
bankWriter = new XmlTextWriter("c:\\test1.xml", null);
bankWriter.Formatting = Formatting.Indented;
bankWriter.Indentation = 6;
bankWriter.Namespaces = false;
bankWriter.WriteStartDocument();
bankWriter.WriteStartElement("computer");
comp.GetDiskDrive();
foreach (Disk disk in comp.disks)
{
bankWriter.WriteStartElement("component");
bankWriter.WriteStartElement("type");
bankWriter.WriteString("Hard Disk");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("name");
bankWriter.WriteString(disk.caption);
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Manufacturer");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteString(disk.Manufacturer);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Size");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(disk.size);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Interface");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(disk.InterfaceType);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
}

foreach (Memory memchip in comp.memchips)
{
bankWriter.WriteStartElement("component");
bankWriter.WriteStartElement("type");
bankWriter.WriteString("Physical Memory");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("name");
bankWriter.WriteString(memchip.Caption);
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("PositionInRow");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteString(memchip.PositionInRow);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Capacity");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(memchip.Capacity);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("FormFactor");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(memchip.FormFactor);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
}

bankWriter.WriteEndDocument();
bankWriter.Flush();
 
D

DeveloperX

I am trying to rewrite a vbs script in c# that collects data from a pc and writes it into an xml file
I have figured out how to write the file with data in an array. Smple of code below.
But that seems quite inefficient considering I have to collect many many properties for different items
The number of elements will differ from item to item
Does anyone have an idea on how to create a function that will write xml file without explicit knowlege what is inside if an array?
Thank You for your help
alexseys

XmlTextWriter bankWriter = null;
bankWriter = new XmlTextWriter("c:\\test1.xml", null);
bankWriter.Formatting = Formatting.Indented;
bankWriter.Indentation = 6;
bankWriter.Namespaces = false;
bankWriter.WriteStartDocument();
bankWriter.WriteStartElement("computer");
comp.GetDiskDrive();
foreach (Disk disk in comp.disks)
{
bankWriter.WriteStartElement("component");
bankWriter.WriteStartElement("type");
bankWriter.WriteString("Hard Disk");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("name");
bankWriter.WriteString(disk.caption);
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Manufacturer");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteString(disk.Manufacturer);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Size");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(disk.size);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Interface");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(disk.InterfaceType);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();

}

foreach (Memory memchip in comp.memchips)
{
bankWriter.WriteStartElement("component");
bankWriter.WriteStartElement("type");
bankWriter.WriteString("Physical Memory");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("name");
bankWriter.WriteString(memchip.Caption);
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("PositionInRow");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteString(memchip.PositionInRow);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Capacity");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(memchip.Capacity);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("FormFactor");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(memchip.FormFactor);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();

}

bankWriter.WriteEndDocument();
bankWriter.Flush();

Well XML may be a solution. That sounds daft I know as XML is the
problem. It looks like you have one structure for each hardware item,
so one for chips and one for hardrives in the example provided.

You could define an xml document which would act as a template, then
associate attributes with each property and read the property's
attribute to find out what node to populate in the template.

You could make your objects serializable and ensure their structure
mirrors the structure you want to get out, then you could just
serialize each object. Or define a more appropriate structure,
serialize and you xslt to transform it into the right output format
(I'm not very good at that so can't help too much)

Alternatively there seem to be repeating concepts in your structure.
So define a class which encapsulates the xml writing with methods like
AddComponent, AddAttr and so forth. Where you've got a nested
hierachy, youo could then call say Addcomponent which would add
attribute and name using AddAttr and AddName.
Then your object, say the harddrive can have a method like
WriteMeToAFile. I have to say there may be an issue with that which
could be resolved with the next suggestion, although I'm struggling to
fully visualise the final XML, so it might be really simple.
Basically I'm saying Identify super nodes, then their consistituent
nodes and build the output with as few calls to the supernode writers
as possible. See the example below.

<House>
<Address>
<AddressLine>
<AddressLine>
</Address>
<Bedrooms>
</Bedrooms>
</House>

We can see Address consists of a number of address lines. So to create
an address you could create a method that takes an array of strings,
one for each line.
We can see a house consists of an address and number of bedrooms, so
we could construct a house with MakeHouse({addresslines},2)
If we added Rooms, a structure that looks like Address (ie one subnode
per room name) we could modify AddAddress and create an AddRooms which
both call AddMultipleStrings. To create an address you'd call
AddMultipleStrings("Address",{strings}). By calling that from
AddAddress you don't have to change code that already adds an address.

I can see some patterns in the xml, but it's a little unclear. If it's
feasable to redefine the structure, you could simplify it I think.
Using attributes would help keep things clearer.
<Component name="Hard disc" size="big"></Component>

Well that was rambling, but it might point you in the right direction,
post if there's anything unclear.
 
S

sloan

See

9/21/2005
XmlSerialization with IDictionary and CollectionBase Objects

http://sholliday.spaces.live.com/blog/

for some ideas.



I am trying to rewrite a vbs script in c# that collects data from a pc and writes it into an xml file
I have figured out how to write the file with data in an array. Smple of code below.
But that seems quite inefficient considering I have to collect many many properties for different items
The number of elements will differ from item to item
Does anyone have an idea on how to create a function that will write xml file without explicit knowlege what is inside if an array?
Thank You for your help
alexseys

XmlTextWriter bankWriter = null;
bankWriter = new XmlTextWriter("c:\\test1.xml", null);
bankWriter.Formatting = Formatting.Indented;
bankWriter.Indentation = 6;
bankWriter.Namespaces = false;
bankWriter.WriteStartDocument();
bankWriter.WriteStartElement("computer");
comp.GetDiskDrive();
foreach (Disk disk in comp.disks)
{
bankWriter.WriteStartElement("component");
bankWriter.WriteStartElement("type");
bankWriter.WriteString("Hard Disk");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("name");
bankWriter.WriteString(disk.caption);
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Manufacturer");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteString(disk.Manufacturer);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Size");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(disk.size);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Interface");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(disk.InterfaceType);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
}

foreach (Memory memchip in comp.memchips)
{
bankWriter.WriteStartElement("component");
bankWriter.WriteStartElement("type");
bankWriter.WriteString("Physical Memory");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("name");
bankWriter.WriteString(memchip.Caption);
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("PositionInRow");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteString(memchip.PositionInRow);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Capacity");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(memchip.Capacity);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("FormFactor");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(memchip.FormFactor);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
}

bankWriter.WriteEndDocument();
bankWriter.Flush();
 
A

alexseys

Thank you for your ansvers
alexseys
I am trying to rewrite a vbs script in c# that collects data from a pc and writes it into an xml file
I have figured out how to write the file with data in an array. Smple of code below.
But that seems quite inefficient considering I have to collect many many properties for different items
The number of elements will differ from item to item
Does anyone have an idea on how to create a function that will write xml file without explicit knowlege what is inside if an array?
Thank You for your help
alexseys

XmlTextWriter bankWriter = null;
bankWriter = new XmlTextWriter("c:\\test1.xml", null);
bankWriter.Formatting = Formatting.Indented;
bankWriter.Indentation = 6;
bankWriter.Namespaces = false;
bankWriter.WriteStartDocument();
bankWriter.WriteStartElement("computer");
comp.GetDiskDrive();
foreach (Disk disk in comp.disks)
{
bankWriter.WriteStartElement("component");
bankWriter.WriteStartElement("type");
bankWriter.WriteString("Hard Disk");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("name");
bankWriter.WriteString(disk.caption);
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Manufacturer");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteString(disk.Manufacturer);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Size");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(disk.size);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Interface");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(disk.InterfaceType);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
}

foreach (Memory memchip in comp.memchips)
{
bankWriter.WriteStartElement("component");
bankWriter.WriteStartElement("type");
bankWriter.WriteString("Physical Memory");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("name");
bankWriter.WriteString(memchip.Caption);
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("PositionInRow");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteString(memchip.PositionInRow);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("Capacity");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(memchip.Capacity);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("attr");
bankWriter.WriteStartElement("name");
bankWriter.WriteString("FormFactor");
bankWriter.WriteEndElement();
bankWriter.WriteStartElement("value");
bankWriter.WriteValue(memchip.FormFactor);
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
bankWriter.WriteEndElement();
}

bankWriter.WriteEndDocument();
bankWriter.Flush();
 
Top