如何在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文件数据的组合?的主要内容,如果未能解决你的问题,请参考以下文章