David_Wimbley
Я не уверен, что это результат плохого форматирования, но ваш код и XML имеют довольно много проблем. XML-файл искажен, правильно отформатирован будет
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<fields>
<field name="Company Name">
<value>ABC</value>
</field>
<field name="Company Address">
<value>Chicago</value>
</field>
<field name="Company phone">
<value>123-456-7894</value>
</field>
<field name="ACSysHP_ASHP_135k_240k_MeasureID">
<value>2635</value>
</field>
</fields>
</xfdf>
И если вы сериализуете, то правильная структура класса/нотация будет следующей (Примечание: я использовал
Xml2CSharp.com / преобразуйте ваши XML-примеры в совместимые с XmlSerializer классы C# [
^] чтобы преобразовать XML в классы c# для меня)
[XmlRoot(ElementName="field", Namespace="http://ns.adobe.com/xfdf/")]
public class Field {
[XmlElement(ElementName="value", Namespace="http://ns.adobe.com/xfdf/")]
public string Value { get; set; }
[XmlAttribute(AttributeName="name")]
public string Name { get; set; }
}
[XmlRoot(ElementName="fields", Namespace="http://ns.adobe.com/xfdf/")]
public class Fields {
[XmlElement(ElementName="field", Namespace="http://ns.adobe.com/xfdf/")]
public List<Field> Field { get; set; }
}
[XmlRoot(ElementName="xfdf", Namespace="http://ns.adobe.com/xfdf/")]
public class Xfdf {
[XmlElement(ElementName="fields", Namespace="http://ns.adobe.com/xfdf/")]
public Fields Fields { get; set; }
[XmlAttribute(AttributeName="xmlns")]
public string Xmlns { get; set; }
[XmlAttribute(AttributeName="space", Namespace="http://www.w3.org/XML/1998/namespace")]
public string Space { get; set; }
}
Затем, чтобы десериализовать ваш XML в объекты C#, вы бы сделали
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(xml);
writer.Flush();
stream.Position = 0;
var reader = XmlReader.Create(stream, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
var myXmlObject = new XmlSerializer(typeof(Xfdf)).Deserialize(reader) as Xfdf;
Поэтому, как только вы десриализовали свой код, вы можете зациклиться на нем следующим образом
foreach (var item in myXmlObject.Fields.Field)
{
Console.WriteLine("Field Name {0} - Field Value {1}", item.Name, item.Value);
}
Что обеспечивает выход
Цитата:
Наименование поля Название компании - АВС поле Значение
Имя Поля Адрес Компании - Значение Поля Чикаго
Поля Имя, Телефон компании - значение поля 123-456-7894
Имя Поля ACSysHP_ASHP_135k_240k_MeasureID - Значение Поля 2635
РЕДАКТИРОВАТЬ:
Измененный XML для поддержки новых имен полей/свойств
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<fields>
<field>
<CompanyName>ABC</CompanyName>
<CompanyPhoneNumber>ABC</CompanyPhoneNumber>
<CompanyAddress>ABC</CompanyAddress>
</field>
<field>
<CompanyName>ABC</CompanyName>
<CompanyPhoneNumber>ABC</CompanyPhoneNumber>
<CompanyAddress>ABC</CompanyAddress>
</field>
<field>
<CompanyName>ABC</CompanyName>
<CompanyPhoneNumber>ABC</CompanyPhoneNumber>
<CompanyAddress>ABC</CompanyAddress>
</field>
<field>
<CompanyName>ABC</CompanyName>
<CompanyPhoneNumber>ABC</CompanyPhoneNumber>
<CompanyAddress>ABC</CompanyAddress>
</field>
</fields>
</xfdf>
Измененный класс полей для сериализации
[XmlRoot(ElementName="field", Namespace="http://ns.adobe.com/xfdf/")]
public class Field {
[XmlElement(ElementName="CompanyName", Namespace="http://ns.adobe.com/xfdf/")]
public string CompanyName { get; set; }
[XmlElement(ElementName="CompanyPhoneNumber", Namespace="http://ns.adobe.com/xfdf/")]
public string CompanyPhoneNumber { get; set; }
[XmlElement(ElementName="CompanyAddress", Namespace="http://ns.adobe.com/xfdf/")]
public string CompanyAddress { get; set; }
}
Что тогда позволит вам сделать
foreach (var item in myXmlObject.Fields.Field)
{
Console.WriteLine("CompanyName: {0}", item.CompanyName);
Console.WriteLine("CompanyAddress: {0}", item.CompanyAddress);
Console.WriteLine("CompanyPhoneNumber: {0}", item.CompanyPhoneNumber);
}
David_Wimbley
Я обновил свой ответ. У вас есть несколько вариантов сделать то, что вы хотите в своем XML. Я не уверен, что вы только учитесь или нет, поэтому я не очень заботился о форматировании XML, как я бы предпочел, но если ваша цель состоит в том, чтобы сохранить исходное форматирование элемента поля с одним дочерним элементом значения, то вам нужно будет изменить XML, который я обновил с элементов на атрибуты поля, а также изменить класс C#, чтобы он вел себя как свойство name.
Но, исходя из того, что я понимаю, вы хотите сделать, вышеприведенная правка должна достичь этого.
David_Wimbley
Тогда я бы сказал, что вам нужно расширить этот первый вариант. Вы действительно создадите свой собственный класс в нужном вам формате, а затем сериализуете XML в классы C# выше, но затем присваиваете эти значения своему пользовательскому классу.
Экс:
var myData = new List<ProperFormattedXmlClass>();
foreach(var item in myXmlObject.Fields.Field)
{
var data = new ProperFormattedXmlClass();
if(item.Name == "Company Name")
{
//Assign company name value here to .CompanyName from my class
data.CompanyName = item.Value;
}
}