How to only show xml attributes that are not optional? In C#
I want to only show non-optional data from an XML file in C# but I've never used it before and I'm new in the serialization method.
I've got an XSD with:
<xs:attribute name="SpecialtyCd" type="xs:string" />
<xs:attribute name="DoctorUid" type="xs:string" />
<xs:attribute name="ValidFrom" type="xs:date" use="optional"/>
<xs:attribute name="ValidUntil" type="xs:date" use="optional"/>
And I have a FillEditWindow() statement where I dynamically make labels and textboxes:
private void FillEditWindow(PropertyInfo p, object dc, Type t)
{
object[] attributes = p.GetCustomAttributes(true);
bool ignore = attributes.Any(a => a.ToString().Contains("XmlIgnoreAttribute"));
if (!ignore)
{
Label lbl = new Label();
whatCategorieName = p.Name;
var whatCategorieSource = p.GetValue(dc, null);
lbl.Content = whatCategorieName + ':';
lbl.FontFamily = new FontFamily("Verdana");
lbl.FontWeight = FontWeights.Bold;
lbl.Width = 400;
EditControls.Children.Add(lbl);
//Check if Date//
if (p.PropertyType == typeof(DateTime))
{
DatePicker datePicker = new DatePicker();
datePicker.Name = whatCategorieName;
datePicker.Width = 400;
DateTime dateSource = DateTime.Parse(whatCategorieSource.ToString());
if (dateSource.ToString() != "1/01/0001 0:00:00")
{
datePicker.SelectedDate = dateSource;
}
datePicker.DisplayDateStart = new DateTime(1980, 1, 1);
datePicker.DisplayDateEnd = new DateTime(2050, 12, 31);
datePicker.FirstDayOfWeek = DayOfWeek.Monday;
EditControls.Children.Add(datePicker);
}
//Check if Boolean
else if (p.PropertyType == typeof(Boolean))
{
Boolean trueOrFalse = Convert.ToBoolean(whatCategorieSource);
CheckBox boxTrueOrFalse = new CheckBox();
boxTrueOrFalse.Name = whatCategorieName;
boxTrueOrFalse.Width = 400;
EditControls.Children.Add(boxTrueOrFalse);
//Check if true or false
if (trueOrFalse == true)
{
boxTrueOrFalse.IsChecked = true;
}
else if (trueOrFalse == false)
{
boxTrueOrFalse.IsChecked = false;
}
}
//Check if String
else if (p.PropertyType == typeof(string))
{
TextBox txt = new TextBox();
txt.Width = 400;
if (whatCategorieSource != null)
{
txt.Name = whatCategorieName;
txt.Text = whatCategorieSource.ToString();
}
else
{
txt.Nam开发者_如何学Ce = whatCategorieName;
txt.Text = "";
}
EditControls.Children.Add(txt);
}
Is it possible to check with an if statement if the attribute is optional or not?
Also if it is any help here is where I get my data from (when I click on a certain item in a TreeView I get an editscreen with all the attributes in it):
private void TextBlock_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var dc = ((FrameworkElement)e.OriginalSource).DataContext;
selectedItemHosp = null;
selectedItemList = null;
selectedItemExamDef = null;
if (dc != null && dc is HospitalWrapper)
{
if (dc is HospitalWrapper && !((HospitalWrapper)dc).IsTitle)
{
var context = ((HospitalWrapper)dc).Context;
selectedItemHosp = (HospitalWrapper)dc;
canSave = true;
string edit = ((TextBlock)sender).Text.ToString();
labelEdit.Text = ((TextBlock)sender).Text.ToString();
Type t = context.GetType();
PropertyInfo[] pi = t.GetProperties();
EditControls.Children.Clear();
EditControlsLayout.Visibility = Visibility.Visible;
sourceOfEdit = "Hospitals";
//Change Data
foreach (PropertyInfo p in pi)
{
if (p.PropertyType == typeof(string) || p.PropertyType == typeof(DateTime) || p.PropertyType == typeof(Boolean))
{
FillEditWindow(p, context, t);
}
}
}
For optional fields you need to use a nullable type (see below) and translate to string since DateTime?
cannot be represented as attribute. For mandatory ones, initialise them to empty string:
public class MyClass
{
public MyClass()
{
SpecialtyCd = string.Empty;
DoctorUid = string.Empty;
}
[XmlAttribute]
public string SpecialtyCd { get; set; }
[XmlAttribute]
public string DoctorUid { get; set; }
[XmlIgnore]
public DateTime? ValidFrom { get; set; }
[XmlIgnore]
public DateTime? ValidUntil { get; set; }
[XmlAttribute("ValidUntil")]
public string ValidUntilString
{
get { return ValidUntil.HasValue ? ValidUntil.Value.ToString() : null; }
set
{
ValidUntil = value== null ? (DateTime?) null : DateTime.Parse(value) ;
}
}
[XmlAttribute("ValidFrom")]
public string ValidFromString
{
get { return ValidFrom.HasValue ? ValidFrom.Value.ToString() : null; }
set
{
ValidFrom = value== null ? (DateTime?) null : DateTime.Parse(value) ;
}
}
}
精彩评论