Разбор XML с C #? - PullRequest
       38

Разбор XML с C #?

2 голосов
/ 12 февраля 2009

Я работаю над проектом для школы, который включает в себя большое количество анализа XML. Я пишу код на C #, но мне еще предстоит найти «подходящий» метод анализа этого XML. Я рассмотрел несколько разных способов, но еще не понял это правильно; так что я пришел к тебе. В идеале я ищу что-то похожее на Beautiful Soup в Python (вроде).

Мне было интересно, есть ли способ конвертировать XML следующим образом:

<config>
    <bgimg>C:\\background.png</bgimg>
    <nodelist>
        <node>
            <oid>012345</oid>
            <image>C:\\image.png</image>
            <label>EHRV</label>
            <tooltip>
                <header>EHR Viewer</header>
                <body>Version 1.0</body>
                <icon>C:\\ico\ehrv.png</icon>
            </tooltip>
            <msgSource>8181:iqLog</msgSource>
        </nodes>
    </nodeList>
<config>

В массив / Hastable / Dictionary / Other, как это:

Array
(
["config"] => array
    (
    ["bgimg"] => "C:\\background.png"
    ["nodelist"] => array
        (
        ["node"] => array
            (
            ["oid"] => "012345"
            ["image"] => "C:\\image.png"
            ["label"] => "Version 1.0"
            ["tooltip"] => array
                (
                ["header"] => "EHR Viewer"
                ["body"] => "Version 1.0"
                ["icon"] => "C:\\ico\ehrv.png"
                )
            ["msgSource"] => "8181:iqLog"
            )
        )
    )
)

Даже просто дать мне достойный ресурс для просмотра было бы очень полезно. Спасибо за тонну.

Ответы [ 10 ]

9 голосов
/ 12 февраля 2009

Я бы посмотрел на Linq to Xml . Это дает вам объектную структуру, похожую на XML-файл, которую довольно легко пройти.

5 голосов
/ 12 февраля 2009

XmlDocument + XPath - это почти все, что вам когда-либо нужно в .NET для анализа XML.

1 голос
/ 12 февраля 2009

Лучший подход будет продиктован тем, что вы на самом деле хотите делать с данными после их анализа.

Если вы хотите передать его структурированным, но не привязанным к XML способом, XML Serialization , вероятно, будет вашим лучшим выбором. Это также приблизит вас к описанному, хотя вы будете иметь дело с графом объектов, а не с вложенными картами.

Если вы просто ищете удобный формат для запроса определенных бит данных, лучшим вариантом будет LINQ to Xml . В качестве альтернативы вы можете использовать более традиционные классы в пространстве имен System.Xml (начиная с XmlDocument) и выполнять запросы с использованием XPath.

Вы также можете использовать любой из этих методов (или XmlTextReader ) в качестве строительных блоков для создания описанной вами структуры данных, но, если не считать особой необходимости, я не думаю, что она даст вам больше, чем другие подходы.

1 голос
/ 12 февраля 2009

Вы должны демонстративно использовать LINQ для XML , A.K.A. XLINQ. Есть хороший инструмент под названием LINQPad , который вы должны проверить. Он имеет приятные функции, от обширной библиотеки примеров до возможности прямого запроса базы данных SQL через Linq to SQL. Лучше всего то, что он позволяет вам проверять ваши запросы, прежде чем вводить их в код.

1 голос
/ 12 февраля 2009

Нет ничего постыдного в использовании старомодного XmlDocument:

var xml = "<config>hello world</config>";
var doc = new System.Xml.XmlDocument();
doc.LoadXml(xml);
var nodes = doc.SelectNodes("/config");
1 голос
/ 12 февраля 2009

Должно быть полдюжины разных способов сделать это в C #. Мой любимый использует пространство имен System.Xml, в частности System.Xml.Serialization.

Вы используете инструмент командной строки под названием xsd.exe, чтобы превратить образец xml в файл схемы xsd (совет: убедитесь, что в вашем списке узлов есть более одного узла в образце), а затем снова используйте его в схеме для что в файл класса C # вы можете загрузить его в свой проект и легко использовать с классом System.Xml.Serialization.XmlSerializer.

0 голосов
/ 18 марта 2009

Да, я согласен .. Линк-путь очень хорош. И мне особенно нравится, как вы пишете XML, используя его.

Намного проще использовать путь "объекты в объектах".

0 голосов
/ 12 февраля 2009

Я лично использую XPathDocument, XPathNavigator и XPathNodeIterator, например,

XPathDocument xDoc = new XPathDocument(CHOOSE SOURCE!);

XPathNavigator xNav = xDoc.CreateNavigator();

XPathNodeIterator iterator = xNav.Select("nodes/node[@SomePredicate = 'SomeValue']");

while (iterator.MoveNext())
{
    string val = iterator.Current.SelectSingleNode("nodeWithValue");

    // etc etc
}
0 голосов
/ 12 февраля 2009

Мне лично нравится отображать элементы XML на классы и наоборот, используя System.Xml.Serialization.XmlSerializer class.

http://msdn.microsoft.com/es-es/library/system.xml.serialization.xmlserializer(VS.80).aspx

0 голосов
/ 12 февраля 2009

Вы также можете использовать сериализацию для преобразования текста XML обратно в строго типизированный экземпляр класса.

...