Данные в узле XML в таблицу - PullRequest
0 голосов
/ 21 апреля 2011

отредактировано:

 <people>
        <person>
            <name>John Doe</name>
            <age>21</age>
        </person>
        <person>
            <name>Jane Smith</name>
            <age>24</age>
        </person>
    </people>

На самом деле я хочу узнать, как получить имя и возраст одновременно, используя xpath.Я могу получить имя, используя

string fileName = "testinfo.xml";
            XPathDocument doc = new XPathDocument(fileName);

            XPathNavigator nav = doc.CreateNavigator();
            XPathExpression expr;
            expr = nav.Compile("/People/Person/name");
            XPathNodeIterator iterator = nav.Select(expr);

           try{
               while (iterator.MoveNext())
            {

                XPathNavigator nav2 = iterator.Current.Clone();
                Console.WriteLine("name" + nav2.Value);

            }
            }
catch(Exception ex) 
{
   Console.WriteLine(ex.Message);
}

. Мне нужно получить имя и возраст в цикле while, перебирая узел xml только один раз.извините за неясно.

Ответы [ 4 ]

4 голосов
/ 21 апреля 2011

Прежде всего, пара комментариев на ваш вопрос:

Ваш пример XML на самом деле не поддается легкому ответу. Давайте изменим это на что-то более семантическое дружественное (это слово?):

<people>
    <person>
        <name>John Doe</name>
        <age>21</age>
    </person>
    <person>
        <name>Jane Smith</name>
        <age>24</age>
    </person>
</people>

Ваш вопрос на самом деле не упоминает, что вы пытались решить проблему. Как сказал NovaJoe, кодирование этого было бы довольно тривиально с использованием Linq-to-XML и Linq-to-SQL, так как же вы предпочитаете взаимодействовать с вашей базой данных? Вы писали код C # в прошлом для подключения к базе данных? Вы знакомы с LINQ? ( Если нет, вы должны изучить это! )

Чтобы убедить вас в том, как плохо вы должны изучать вышеупомянутые технологии, если вы еще не знакомы с ними, я поделился кратким примером Linq-to-XML и Linq-to-SQL, используя отличную программу LINQPad

У меня была следующая таблица базы данных:

CREATE TABLE [dbo].[People]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](max) NOT NULL,
    [Age] [int] NOT NULL,
    CONSTRAINT [PK_People] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )
    WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

И я использовал LinqPAD, чтобы просто открыть для меня стандартное соединение Linq-to-SQL: sample linqpad database connection

Наконец, код C #:

// Connect to the database using linq-to-sql
var db = new TypedDataContext();

// Load the xml file using linq-to-xml
var doc = XDocument.Load(@"C:\path\to\file\people.xml");
var people = doc.Descendants("person");
foreach (var person in people)
{
    // Create person object
    var personObject = new People();
    personObject.Name = person.Descendants("name").Single().Value;
    personObject.Age = Convert.ToInt32(person.Descendants("age").Single().Value);
    // Queue to add person to database
    db.People.InsertOnSubmit(personObject);
}

// Finally, submit any pending changes
db.SubmitChanges();

В результате в мою базу данных поступили следующие данные:

table with data

3 голосов
/ 21 апреля 2011

Вы не говорите нам много, как вы хотите сделать это - хранимая процедура? Специальный SQL-запрос из вашего приложения? Как выглядит твой стол ??

Исходя из вашего ввода, вы можете разобрать его в «псевдотаблица» или строки и столбцы с помощью этого выражения SQL XQuery:

DECLARE @input XML = '<element1>
    <element2>
        <element3>b</element3>
        <element4>c</element4>
    </element2>
    <element2>
        <element3>b</element3>
        <element4>c</element4>
    </element2>
</element1>'

SELECT
    e2.value('(element3)[1]', 'varchar(50)') AS 'Element3',
    e2.value('(element4)[1]', 'varchar(50)') AS 'Element4'
FROM
    @input.nodes('/element1/element2') AS E1(E2)

Возвращает результат:

Element3    Element4
   b           c
   b           c

и, конечно, вы также можете написать оператор INSERT INTO ....... вместо просто SELECT на основе этого вывода строк / столбцов и вставить свои проанализированные данные XML в реляционную таблицу. Вы могли бы, например, иметь хранимую процедуру, которая принимает параметр типа XML из вашего приложения C #, а затем выполнять анализ и вставку в таблицу внутри этой хранимой процедуры.

0 голосов
/ 22 апреля 2011

я нашел то, что искал, ребята.

 expr = nav.Compile("/people/person/*[self::name or self::age]");

с помощью вышеизложенного я могу одновременно получить как имя, так и возраст, используя xpath. Как только я найду все ваши ответы очень интересными.

спасибо

0 голосов
/ 21 апреля 2011

Все зависит от реализации вашей базы данных. Если бы мне пришлось это сделать, я бы использовал Linq-to-XML для извлечения значений из узлов XML, а затем я бы использовал LINQ-to-SQL для помещения его в базу данных.

...