如何在c#中读取xml文件的节点,其中xml文件是2 xml文件数据的组合?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在c#中读取xml文件的节点,其中xml文件是2 xml文件数据的组合?相关的知识,希望对你有一定的参考价值。

我将2个xml文件数据合并到一个xml文件中,该文件将采用以下语法

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="c:usersReport.xsl"?>
<Report>
 <Messages>
  <Message>
    My Data
  </Message>
 </Messages>
</Report>
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="c:usersReport.xsl"?>
<Report>
 <Messages>
  <Message>
    My Data
  </Message>
</Messages>
</Report>

我想从<Message> </Message>节点获取文本数据。

我编写了以下通常的xml加载代码来获取详细信息。

            XmlDocument doc = new XmlDocument();
            doc.Load(Path + "\result.xml"); 

但是我收到以下错误。

“意外的XML声明.XML声明必须是文档中的第一个节点,并且不允许在它之前出现空白字符。第10行,第3行。”

错误是因为有两个<?xml声明?如果是这样,获取<Message> </Message>标签内所有数据的最佳方法是什么?

答案

这段代码

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="c:usersReport.xsl"?>

在一开始就可以只包含一次XML文件。

请从结果文件的中间删除这些行。

还请将您的XML包装到一些根标签中。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="c:usersReport.xsl"?>
<Root>
<Report>
 <Messages>
  <Message>
    My Data
  </Message>
 </Messages>
</Report>
<Report>
 <Messages>
  <Message>
    My Data
  </Message>
</Messages>
</Report>
</Root>
另一答案

以下代码将读取您的xml没有错误。解决了重复问题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:	emp	est.xml";
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader(FILENAME);
            string input = "";
            string xml = "";
            while((input = reader.ReadLine()) != null)
            {
                if (!input.StartsWith("<?xml"))
                {
                    xml += input;
                }
            }
            StringReader sReader = new StringReader(xml);
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ConformanceLevel = ConformanceLevel.Fragment;
            XmlReader xReader = XmlReader.Create(sReader, settings);
            List<XElement> reports = new List<XElement>();
            while (!xReader.EOF)
            {
                if (xReader.Name != "Report")
                {
                    xReader.ReadToFollowing("Report");
                }
                if (!xReader.EOF)
                {
                    reports.Add((XElement)XElement.ReadFrom(xReader));
                }
            }

        }
    }
}
另一答案

基于@DotNet Fan的回答。删除重复的<?xml行并使用根元素包装元素。这是代码:

// read all the lines
var allLines = File.ReadAllLines(@"G:TestFilesTextFile1.txt");

var filtered = 
allLines.Take(2).   // take the first two lines i.e. the declaration
Concat(new string[] { "<Root>" }).  // add a Root element start header
Concat(allLines.Where(l => !l.StartsWith("<?xml"))). // get all lines that do not start with <?xml
Concat(new string[] { "</Root>" }); // add the end header

string oneXmlFile = string.Join(Environment.NewLine, filtered); // join all lines into one string

XDocument document = XDocument.Parse(oneXmlFile);   // read the new string as XML

这是XML结果文件

<?xml-stylesheet type="text/xsl" href="c:usersReport.xsl"?>
<Root>
  <Report>
    <Messages>
      <Message>
    My Data
  </Message>
    </Messages>
  </Report>
  <Report>
    <Messages>
      <Message>
    My Data
  </Message>
    </Messages>
  </Report>
</Root>
另一答案

删除此代码

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="c:usersReport.xsl"?>

xml文件有格式错误

以上是关于如何在c#中读取xml文件的节点,其中xml文件是2 xml文件数据的组合?的主要内容,如果未能解决你的问题,请参考以下文章

在c#的winform 下怎么读取 xml文件中的数据?

java中如何读取xml中数据。多节点的。给我一个例子,谢谢。

如何在 pig 中读取带有嵌套节点的 XML 文件

java 如何读取xml文件中的一个节点下的多个相同子节点

用C#读取XML文件,怎么可以循环读取

C#如何读取xml文件里面节点里面的属性信息?