Преобразование XML-документа в свободный C # - PullRequest
3 голосов
/ 20 января 2009

Я хотел бы преобразовать внешний XML-документ без какой-либо связанной с ним XSD-схемы в свободный объект .NET.

У меня есть простой XML-файл, такой как:

<application>
    <parameters>
        <param></param>
        <param></param>
    </parameters>
    <generation />
    <entities>
        <entity ID="1">
            <PropTest>Test</PropTest>
        </entity>
        <entity ID="2">
            <PropTest>Another Test</PropTest>
        </entity>
     </entities>
</application>

Я бы хотел перемещаться по документу, как:

var xConfig = new XmlConfig("file.xml");

// testValue should be assigned "Test"
string testValue = xConfig.Generation.Entities.Entity(1).PropTest;

Каков лучший способ добиться этого в .NET 3.5?

Ответы [ 6 ]

2 голосов
/ 20 января 2009

Я только что заметил, что Lusid также писал о Linq to SQL, когда писал свой ответ, но он использовал XDocument.

Вот моя версия (file.xml - XML, указанный в вопросе):

string testValue =
    (string) XElement.Load("file.xml")
        .Element("entities")
        .Elements("entity")
        .FirstOrDefault(entity => entity.Attribute("ID")
            .Value == "1") ?? string.Empty;
2 голосов
/ 20 января 2009

Возможно, лучший способ сделать это в наши дни - это Linq to XML. Это намного проще, чем возиться с XSD и замысловатыми определениями классов.

XDocument doc = XDocument.Load("file.xml");
var val = doc
    .Descendants("entity")
    .Where(p => p.Attribute("ID").Value == "1")
    .Descendants("PropTest")
    .FirstOrDefault();
if (val != null)
    Console.WriteLine(val.Value);

Пример файла file.xml, который я использовал:

<?xml version="1.0" encoding="utf-8" ?>
<application>
    <parameters>
        <param></param>
        <param></param>
    </parameters>
    <generation>
        <entities>
            <entity ID="1">
                <PropTest>Test</PropTest>
            </entity>
            <entity ID="2">Another Test</entity>
        </entities>
    </generation>
</application>
1 голос
/ 27 августа 2009

Кевин Хаззард написал свободный XML-интерфейс для C #, используя динамический тип .NET 4.0 part 1 и part 2 . Это позволило бы код как:

var v = dx.application.entities.entity[0].PropTest.Value;
1 голос
/ 20 января 2009

Я бы посмотрел на xsd.exe . Вы также можете перейти на здесь , чтобы получить более информативное руководство по его использованию.

По сути, вы будете создавать эквиваленты класса .NET вашего XSD. После этого вы сможете сериализовать и десериализовать ваши XML и объекты.

0 голосов
/ 20 января 2009

Определение классов, производных от ConfigurationSection / ConfigurationElement и т. Д. Они красиво отображаются в XML-файлы (для этого они и созданы). См. MSDN. Другой способ - создать объекты POCO и задать атрибуты сериализации XML для свойств, а затем использовать System.XML.XMLSerializer для сериализации / десериализации в / из XML. См. MSDN для сериализации XML.

0 голосов
/ 20 января 2009

Если вы просто извлекаете схему (что должно быть легко с xsd.exe), то этот онлайн-инструмент (который также можно загрузить) может помочь вам, я попробовал и все нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...