|
Hi, having some problem parsing XML. How do I print the name of an XML attribute?
<sometag attriba="AAA" attribb="BBB">
SomeText
if(reader.NodeType==XmlNodeType.Element)
{
Console.Write("Element: {0}", tr.Name);
for(int i=0; i
|
|
|
|
|
Norm,
I've been able to pull the names of elements and attributes from an xml file using xpath. The code below will help you do it. Don't forget to add: using System.Xml.XPath;
XmlTextReader xtr = new XmlTextReader( m_sXmlFilePreferences );
while( xtr.Read() )
{
switch( xtr.NodeType )
{
case XmlNodeType.Attribute:
break;
case XmlNodeType.Element:
if( xtr.HasAttributes )
{
if( xtr.Name == "Preferences" )
{
for( int i = 0; i < xtr.AttributeCount; i++ )
{
xtr.MoveToAttribute( i );
if( xtr.Name == "EmailAddress" )
{
m_sEmailAddress = xtr.Value;
txt_Email.Text = m_sEmailAddress;
}
if( xtr.Name == "UpdateAutomatically" && xtr.Value == "true" )
{
m_bUpdateInvestments = true;
checkBox1.Checked = true;
}
if( xtr.Name == "UseEncryption" && xtr.Value == "true" )
{
m_bUseEncryption = true;
checkBox2.Checked = true;
}
if( xtr.Name == "PlayAlerts" && xtr.Value == "true" )
{
m_bPlayAlerts = true;
checkBox3.Checked = true;
} }
}
} // HasAttributes
break;
case XmlNodeType.Text:
break;
case XmlNodeType.CDATA:
break;
case XmlNodeType.ProcessingInstruction:
break;
case XmlNodeType.Comment:
break;
case XmlNodeType.XmlDeclaration:
break;
case XmlNodeType.Document:
break;
case XmlNodeType.DocumentType:
break;
case XmlNodeType.EntityReference:
break;
case XmlNodeType.EndElement:
break;
default :
break;
The structure of the xml file is as follows:
EmailAddress="youremailadderess@yourisp.com"
UpdateAutomatically="true" UseEncryption="true"
PlayAlerts="true"
I hope this helps.
|
|
|
|
|
Thanks I've got it - I neglected MoveToAttribute()
norm
|
|
|
|
|
Is there a method for defineing macros in C# like you can in C++? In C# the #define directive is only for defining symbols.
#define AddAandB (a + b)
|
|
|
|
|
C# doesn't have macro support.
|
|
|
|
|
Thank the lord for that one
I'm not an expert yet, but I play one at work. Yeah and here too.
|
|
|
|
|
In my application I have three combo box drop down lists containing text. I want to create an event handler that
will not allow the contents of ComboBox1 also be selected by ComboBox2 and ComboBox3. How do you do this?
mamaflynny
|
|
|
|
|
override the change event or simply when one is chosen delete the item from the other 2 and add and so on
I'm not an expert yet, but I play one at work. Yeah and here too.
|
|
|
|
|
i'm trying to use the streamreader in csharp to read a .ged file (ascii text). i got it to work but i want to know if there is anything i can do to make it better, ie. programming format, speed, style, etc.
thanks,
Rob
<-----------START----------->
public string[] GetIndex()
{
//
if (fstream == null)
{
MessageBox.Show("Error opening file stream.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
return null;
}
StreamReader fstreamCopy = fstream;
string textLine;
int index;
bool foundName = false;
ArrayList tmpIndex = new ArrayList();
while (fstreamCopy.BaseStream != null)
{
foundName = false;
try
{
textLine = fstreamCopy.ReadLine().Trim();
index = textLine.IndexOf("INDI");
if (index != -1)
{
while (!foundName)
{
textLine = fstreamCopy.ReadLine().Trim();
index = textLine.IndexOf("NAME");
if (index != -1)
{
tmpIndex.Add(textLine.Substring(index + 4).Trim());
foundName = true;
}
}
}
}
catch
{
fstreamCopy.Close();
}
}
string[] indIndex = new String[tmpIndex.Count];
for (int i = 0; i < tmpIndex.Count; i++)
{
indIndex[i] = tmpIndex[i].ToString();
}
return (indIndex);
//
}
<------------END------------>
There are 10 kinds of people. Those who understand binary and those who don't.
|
|
|
|
|
Great, I'll try to add a few constructive comments:
1) Early on, you handle a null value for fstream by showing a message box, then returning a null from the GetIndex() function. Typically, in C# we handle that sort of unexpected condition by throwing a an exception, rather than returning null. Error handling can be done at higher levels with try/catch blocks.
2) I'm guessing you might be thinking the line
<br />
StreamReader fstreamCopy = fstream; is copying the original StreamReader fstream, so that it's position won't be changed. It doesn't work that way, since StreamReader is a reference class, you assignment just creates an alternate name for the same object fstream referrs to.
3) At the bottom, you loop through the ArrayList to create a string array to return. There might be a better way to do this:
tmpIndex.CopyTo( 0, indIndex, 0, tmpIndex.Count );<br />
Burt Harris
|
|
|
|
|
thanks for the help and information. what would you recommend to be the best way to read an ascii file? can i keep it in memory somehow so i can search it at will or should i just read the file everytime i need to?
thanks,
Rob
|
|
|
|
|
You're welcome. Sorry for the delay, I've been on vacation, RVing the Oregon Coast. It was really great.
I'm not sure there is any generic "best" way, it depends on what you want to do with it. Keeping it in memory may help performance slightly, but the OS does enough caching that it's likely to have only a minimal effect in most cases, so I'd concentrate on what's most convienent from your application's standpoint to start. In many cases, I think about making a pass through a file, building an in-memory data structure from it's contents because I want to access it randomly (say by a persons's name) rather than sequentially.
Good luck
Burt Harris
|
|
|
|
|
I've been looking at a lot of C# code lately and have noticed that many people write property getters and setters inline, like this:
String Name
{
get { return m_name; }
set { m_name = value; }
}
I've always like to put curly braces on lines by themselves, but I find this style appealing. The problem is when a getter or setter is more than one line long. Then I end up with something like this:
String Name
{
get { return m_name; }
set
{
if (m_name == value)
return;
m_name = value;
UpdateSomething();
}
}
So the get is inline but the set is not. I'm not too thrilled about this inconsistency and would like some opinions on the matter.
How do you do it?
Thanks,
Alvaro
If you want to get to the top, prepare to kiss a lot of bottom. -- despair.com
|
|
|
|
|
I've always done it this way :
public string Name
{
get
{
}
set
{
}
}
even if the codes are only 1 line long. I know it makes my coded bloated but i figure, that's what the collapsing options are there for. Besides, they're much easier to read.
God, I pity me! - Phoncible P. Bone
If I end up Windows ME someone is going to be hurting. - One of the answers to a question for What OS are you
|
|
|
|
|
I'm with Nick, each brace on its own line no matter the amount of code within the get/set.
But I explicitly define regions around the code block; which I don't know if Nick does.
#region Public Properties
#region MyProp
public type MyProp
{
get
{
return myProp;
}
set
{
myProp = value;
}
}
#endregion
#region SecondProp
public t2 SecondProp
{
get
{
...
}
set
{
...
}
}
#endregion
#endregion This formats everything rather nicely so I can view just the properties and methods I want while looking at the source.
James
"My words but a whisper -- your deafness a SHOUT.
I may make you feel but I can't make you think." - Thick as a Brick, Jethro Tull 1972
|
|
|
|
|
I would maybe skip the #region bit for every single property, since they are easily collapsed anyway...
|
|
|
|
|
James T. Johnson wrote:
I explicitly define regions around the code block
I think that an implicit region is defined for each Method (or attribute, in this case),
so you might not need to do that....
I use regions to group members with similar characteristics, like
<br />
#region Private Fields<br />
#endregion<br />
<br />
#region Public Attributes<br />
#endregion<br />
<br />
#region Public Static Methods<br />
#endregion<br />
<br />
#region Constructors<br />
#endregion<br />
<br />
and so on
F.O.R.
|
|
|
|
|
|
Frank Olorin Rizzi wrote:
I think that an implicit region is defined for each Method (or attribute, in this case),
so you might not need to do that....
Correct, but if you have any Attributes or comments above the method or prperty then you have another block to expand/collapse. This way I still have only one region to expand to see everything and on region to collapse when I'm done.
And for whatever reason I never liked the (...) it appends
James
"My words but a whisper -- your deafness a SHOUT.
I may make you feel but I can't make you think." - Thick as a Brick, Jethro Tull 1972
|
|
|
|
|
James T. Johnson wrote:
And for whatever reason I never liked the (...) it appends
[g]Agreed, but I hate the fact that it collapses blank lines ![/g]
F.O.R.
|
|
|
|
|
I vary...
I usually do:
string Name
{
get
{
return m_name;
}
set
{
if(m_name == value) return;
m_name = value;
UpdateSomething();
}
}
(Note on the side: I put the return statement on the same line as the if, since it isn't braced.)
But when I have properties where both the get/set are one-liners, I either use:
string Name
{
get{return m_name;}
set{m_name = value;}
}
or when there are a lot of them, I may even:
string Firstname{ get{return m_firstname;} set{m_firstname = value;} }
string Lastname{ get{return m_lastname;} set{m_lastname = value;} }
string Address{ get{return m_address;} set{m_address= value;} }
I always know that if I used the latter, that its just setting a similarily named membervariable, and no special logic...
|
|
|
|
|
Well i like the first one... with a minor modificataion... Since i like the gull-wings (swedish translation) on the same row as the code, (java-style).
String Name{
get { return m_name; }
set{
if (m_name == value)
return;
m_name = value;
UpdateSomething();
}
}
|
|
|
|
|
I do the "inconsistent" way:
<br />
public string Name<br />
{<br />
get { return _name; }<br />
set<br />
{<br />
return x;<br />
}<br />
}<br />
might be inconsistent,
but I don't think it's too bad...
..after all, the get and set are truly two separate methods,
so if you look at them separately, they end up being consistent
with the rest of the code (where I generally have on one line ONLY the one-liner methods)..
F.O.R.
PS: Then again, it's all style, and that's all about personal preference, right?
|
|
|
|
|
The get and set will always have to have the braces. But
the real problem here is that if the code after a if or what ever
is more than one line then anything after that will not be run.
public string Name
{
set
{
if ( m_name != value )
m_name = value;
m_name.Validate;
}
}
That is why I do like you do because it makes the more readable
and the intent is clearly there. I have seen code that has this
kind of style thru out and it is hard to read.
public string Name
{
get
{
if ( m_name != value )
{
m_name = value;
m_name.Validate;
}
}
}
Bo Hunter
<marquee behavior="alternate">Bo Hunter
|
|
|
|
|
It's not about C# but rather about reading: if You can read using "quick" method (I don't know about it's name in English) e.g You can see all the page (screen) (impossible to remember) the easier way is:
if(...) ...; else ...;
get { ... };
But if You use "standard" method (You can see only few letters, but have better memory) the better way is:
if(...)
...;
else
...;
set
{
...
}
So - Dijkstra, Kerningham etc. couldn't read with "quick" method. It's all. Sorry for my language.
Hi,
AW
|
|
|
|