Как разобрать документ xml без узла root? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть документ xml, в котором отсутствует узел root. Он выглядит так:

<?xml version="1.0"?>
    <Line>
        <City>Paris</City>
        <Country>France</Country>
    </Line>
    <Line>
        <City>Lissabon</City>
        <Country>Spain</Country>
    </Line>

Нет, я хочу прочитать Line через Line и записать содержимое в базу данных. Однако, похоже, что XmlDocument настаивает на том, что должен существовать узел root. Как мне обработать этот файл?

Ответы [ 3 ]

1 голос
/ 25 мая 2020

Если вы хотите проанализировать его как документ XML, вы можете добавить узел root, как Денис предложил в его комментарии .

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

Это будет выглядеть примерно так:

string line;  

// Read the file and process it line by line.  
var reader = new StreamReader(FILEPATH);  
while((line = reader.ReadLine()) != null)  
{
    // Depending on what you need, you could strip the XML tags  
    // And write the line to the database  
}  

reader.Close();  
0 голосов
/ 25 мая 2020

Может быть не лучшим решением, но вы можете создать List (или массив) из своего XML и вставить недостающие узлы:

// Read lines into List
var list = File.ReadLines("doc.xml").ToList();
// Insert missing nodes
list.Insert(1, "<root>"); // Use 1, because 0 is XML directive
list.Insert(list.Count, "</root>"); //Add closing tag to the end
// Create final XML string with LINQ
var xml_str = list.Aggregate("", (acc, s) => acc + s);
// Having a string, we can create, for instance, XElement (or XDocument)
var xml = XElement.Parse(xml_str);
Console.WriteLine(xml.Element("Line").Element("City").Value);
//Output: Paris
0 голосов
/ 25 мая 2020

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

using System;
using System.Text;
using System.Xml;
using System.Windows.Forms;

namespace WindowsFormsApp11
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            XmlReaderSettings settings = new XmlReaderSettings
            {
                ConformanceLevel = ConformanceLevel.Fragment
            };
            using (XmlReader reader = XmlReader.Create(@"c:\ab\countries.xml", settings))
            {
                while(reader.Read())
                {
                    if (reader.Name != "Line") // Ignore the <Line> nodes
                    {
                        switch (reader.NodeType)
                        {
                            case XmlNodeType.Element:
                                sb.Append(string.Format("{0}:", reader.Name));
                                break;

                            case XmlNodeType.Text:
                                sb.Append(string.Format(" {0}{1}", reader.Value, Environment.NewLine));
                                break;
                        }
                    }
                }
            }
            richTextBox1.Text = sb.ToString();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...