C#Linq XML InvalidOperationException

时间:2017-04-03 08:43:07

标签: c# xml linq

我正在尝试基于.csv文件创建XML文件。我想我可以使用我的旧方法来读取.csv文件,只需更换一些部分。但是我得到一个例外说:

  

出现InvalidOperationException

这是我的代码:

    public void LoadFile() {
        XDocument outputDocument = new XDocument();
        outputDocument.Add(new XElement("Inventory"));

        using (var fstream = File.OpenRead(FilePathProducts))
        using (var fileReader = new StreamReader(fstream)) {
            while (!fileReader.EndOfStream) {
                var readLine = fileReader.ReadLine();
                var words = readLine.Split(';');


                outputDocument.Add(
                    new XElement("Item",
                        new XElement("Name", words[1]),
                        new XElement("Count", words[3]),
                        new XElement("Price", words[4]),
                        new XElement("Comment", "<Missing Value>"),
                        new XElement("Artist", "<Missing Value>"),
                        new XElement("Publisher", "Nintendo"),
                        new XElement("Genre", "<Missing Value>"),
                        new XElement("Year", words[0]),
                        new XElement("ProductID", words[2])
                    )
                );
            }
        }

        outputDocument.Save(FilePathResult);
    }

它说了一些关于&#34;创建了错误结构化的文档&#34; (粗略翻译。)

当我尝试删除循环时,输出文件仅显示自动关闭的Inventory标记。我希望它是一个开放和密切的标签。所以我猜测上面代码的第3行出了点问题。

1 个答案:

答案 0 :(得分:3)

您试图将Item元素直接附加到XML文档,并且不允许XML文档具有多个根元素。这就是你收到错误的原因。

我认为你实际上想要将它们添加到Inventory元素中,在这种情况下你应该这样做:

public void LoadFile() {
    var outputDocument = new XDocument();
    var inventory = new XElement("Inventory");
    outputDocument.Add(inventory);

    using (var fstream = File.OpenRead(FilePathProducts))
    using (var fileReader = new StreamReader(fstream)) {
        while (!fileReader.EndOfStream) {
            var readLine = fileReader.ReadLine();
            var words = readLine.Split(';');


            inventory.Add(
                new XElement("Item",
                    new XElement("Name", words[1]),
                    new XElement("Count", words[3]),
                    new XElement("Price", words[4]),
                    new XElement("Comment", "<Missing Value>"),
                    new XElement("Artist", "<Missing Value>"),
                    new XElement("Publisher", "Nintendo"),
                    new XElement("Genre", "<Missing Value>"),
                    new XElement("Year", words[0]),
                    new XElement("ProductID", words[2])
                )
            );
        }
    }

    outputDocument.Save(FilePathResult);
}