Разбор XML в C # - PullRequest
       37

Разбор XML в C #

0 голосов
/ 16 августа 2011

Я все еще работаю над проектом, и мне это очень нравится.

Я хотел посмотреть, смогу ли я реализовать живой канал обновления с использованием XML

на данный момент я даже не знаю, как анализировать этот конкретный тип XML, так как все учебники, которые я нашел, предназначены для анализа значений узлов и т. Д.

но я думал что-то вроде этого

<Object name="ObjectName" type="ObjectType" size="ObjectSize" image="ObjectImage" />

если бы вы, ребята, могли бы помочь мне понять, как получить доступ к внутренним элементам этого узла, это было бы удивительно, и если бы не слишком много, просто попросить небольшое объяснение, чтобы я понял. Я знаю, как разобрать XML, который выглядит так, используя XElement

<Object>
    <Name>ObjectName</Name>
    <Type>ObjectType</Type>
    <Size>ObjectSize</Size>
    <Image>ObjectImage</Image>
</Object>

Мне просто кажется, что я не могу разобрать пример сверху, я не против, если его Linq будет так же длинен, как и в C #, может быть, скажите мне, почему вы выбрали один из других? Также у вас есть идея, как, возможно, проверить, не изменился ли файл, чтобы я мог реализовать обновление в реальном времени?

Спасибо за вашу помощь

John

Ответы [ 3 ]

4 голосов
/ 16 августа 2011

В примере сверху используются атрибуты вместо суб- элементов , но с ним так же легко работать:

XElement element = XElement.Parse(xml);
string name = (string) element.Attribute("name");
string type = (string) element.Attribute("type");
string size = (string) element.Attribute("size");
string image = (string) element.Attribute("image");

Я обычно предпочитаю использовать явное преобразование строки вместо свойства Value , как если бы вы выполняли преобразование по ссылке null, вы просто получаете строковую ссылку null вместоNullReferenceException.Конечно, если это ошибка программирования для отсутствующего атрибута, тогда более подходящим является исключение и свойство Value в порядке.(Кстати, та же логика применима и к преобразованию XElement значений.)

3 голосов
/ 16 августа 2011

Если у вас есть объект домена, который представляет ваш документ (обычно это так), то XmlSerializer довольно прост в использовании.

[XmlRoot("Object")
public class Item
{
   public string Name { get; set; }
   public string Type { get; set; }
   public string Size { get; set; }
   public string Image { get; set; }
}

Использование:

XmlSerializer ser = new XmlSerializer(typeof(Item));
Item item = (Item)ser.Deserialize(someXmlStream);

Я нахожуиспользовать этот подход проще, чем ручной анализ, когда весь документ представляет некоторый объект домена.

2 голосов
/ 16 августа 2011

Использование также может использовать XEelment.FirstAttribute, чтобы получить первый атрибут элемента, а затем XAttribute.NextAttribute, чтобы пройти через них все.Это не зависит от вас, зная, что атрибут присутствует.

XAttribute attribute = element.FirstAttribute;
while (attribute != null)
{
    // Do stuff
    attribute = attribute.NextAttribute`
}
...