无需删除XML声明即可读取XML文件的内容
本文关键字:XML 文件 读取 删除 声明 | 更新日期: 2023-09-27 18:18:00
我想从一个文件中读取所有XML内容。下面的代码只有在删除XML声明( <?xml version="1.0" encoding="UTF-8"?>
)时才能工作。在不删除XML声明的情况下读取文件的最佳方法是什么?
XmlTextReader reader = new XmlTextReader(@"c:'my path'a.xml");
reader.Read();
string rs = reader.ReadOuterXml();
不删除XML声明,reader.ReadOuterXml()
返回一个空字符串。
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://www.as.com/ver/ver.IClaimver/Car</a:Action>
<a:MessageID>urn:uuid:b22149b6-2e70-46aa-8b01-c2841c70c1c7</a:MessageID>
<ActivityId CorrelationId="16b385f3-34bd-45ff-ad13-8652baeaeb8a" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">04eb5b59-cd42-47c6-a946-d840a6cde42b</ActivityId>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">http://localhost/ver.Web/ver2011.svc</a:To>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Car xmlns="http://www.as.com/ver">
<carApplication>
<HB_Base xsi:type="HB" xmlns="urn:core">
<Header>
<Advisor>
<AdvisorLocalAuthorityCode>11</AdvisorLocalAuthorityCode>
<AdvisorType>1</AdvisorType>
</Advisor>
</Header>
<General>
<ApplyForHB>yes</ApplyForHB>
<ApplyForCTB>yes</ApplyForCTB>
<ApplyForFSL>yes</ApplyForFSL>
<ConsentSupplied>no</ConsentSupplied>
<SupportingDocumentsSupplied>no</SupportingDocumentsSupplied>
</General>
</HB_Base>
</carApplication>
</Car>
</s:Body>
</s:Envelope>
我知道使用非xml阅读器的其他方法(例如通过使用File.ReadAllText())
。但是我需要知道一种使用xml方法的方法
<?xml ?>
编码声明前不能有除BOM以外的文本或空格,声明与根元素之间不能有除换行符以外的文本。
其他都是无效文档。
更新:我认为你对XmlTextReader.read()的期望是不正确的。
对XmlTextReader.Read()的每次调用都会遍历XML文档中的下一个"令牌",每次一个令牌。 "Token"指XML元素、空格、文本和XML编码声明。
对reader.ReadOuterXML()的调用返回一个空字符串,因为XML文件中的第一个令牌是XML声明,而XML声明没有OuterXML。
考虑以下代码:
XmlTextReader reader = new XmlTextReader("test.xml");
reader.Read();
Console.WriteLine(reader.NodeType); // XMLDeclaration
reader.Read();
Console.WriteLine(reader.NodeType); // Whitespace
reader.Read();
Console.WriteLine(reader.NodeType); // Element
string rs = reader.ReadOuterXml();
上面的代码产生如下输出:
XmlDeclaration
Whitespace
Element
第一个"令牌"是XML声明。
遇到的第二个"令牌"是XML声明之后的换行符。
遇到的第三个"令牌"是<s:Envelope>
元素。从这里调用reader.ReadOuterXML()将返回我认为您期望看到的内容- <s:Envelope>
元素的文本,这是整个soap包。
如果您真正想要的是将XML文件作为对象加载到内存中,只需调用var doc = XDocument.Load("test.xml")
并且可以一举完成解析。
除非您处理的XML文档非常大,以至于无法容纳系统内存,否则没有太多理由一次查看XML文档中的一个令牌。
XmlDocument doc=new XmlDocument;
doc.Load(@"c:'my path'a.xml");
//Now we have the XML document - convert it to a String
//There are many ways to do this, one should be:
StringWriter sw=new StringWriter();
doc.Save(sw);
String finalresult=sw.ToString();
编辑:我假设你的意思是你实际上在文档声明和根元素之间有文本。如果不是这样,请说明。
如果不删除额外的文本,它就是一个无效的XML文件。我不期望能起作用。您没有XML文件—您有一些类似于XML文件的东西,但是在根元素之前有一些无关的东西。
恕我冒昧,您无法读取此文件。这是因为在根元素<s:Envelope>
之前有一个纯文本,这使得整个文档无效。
将XML文档解析为XML只是为了获得源文本?为什么?
如果你真的想这样做,那么:
string rs;
using(var rdr = new StreamReader(@"c:'my path'a.xml"))
rs = rdr.ReadToEnd();
将工作,但我真的不确定这是你真正想要的。这几乎忽略了它是XML,只是读取文本。对某些东西有用,但不是很多。