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

问题描述 投票:0回答:4

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

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="c:\users\Report.xsl"?>
<Report>
 <Messages>
  <Message>
    My Data
  </Message>
 </Messages>
</Report>
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="c:\users\Report.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>标签内所有数据的最佳方法是什么?

c# .net xml xml-parsing
4个回答
2
投票

这段代码

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

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

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

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

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

1
投票

以下代码将读取您的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:\temp\test.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));
                }
            }

        }
    }
}

1
投票

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

// read all the lines
var allLines = File.ReadAllLines(@"G:\TestFiles\TextFile1.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:\users\Report.xsl"?>
<Root>
  <Report>
    <Messages>
      <Message>
    My Data
  </Message>
    </Messages>
  </Report>
  <Report>
    <Messages>
      <Message>
    My Data
  </Message>
    </Messages>
  </Report>
</Root>

0
投票

删除此代码

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

xml文件有格式错误

© www.soinside.com 2019 - 2024. All rights reserved.