我有需要解析的格式错误的 XML (SOAP) 文件。问题是 XML 没有正确的标题标签。
我试图用 XDocument 和 XmlDocument 解析文件,但都没有奏效。XML 从第 30 行开始,所以也许有某种方法可以在 XML 解析器读取文件之前跳过这些行?
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:eb="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd">
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="Finvoice.xsl"?>
<GGVersion="2.01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="a.xsd">
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader r = XmlReader.Create(file.FullName, settings);
XmlDocument xDoc = new XmlDocument();
xDoc.PreserveWhitespace = true;
xDoc.LoadXml("<xml/>");
xDoc.DocumentElement.CreateNavigator().AppendChild(r);
XmlNamespaceManager manager = new XmlNamespaceManager(xDoc.NameTable);
一旦尝试解析,我得到:意外的 xml 声明。xml 声明必须是文档中的第一个节点....
如果我理解正确,那么您要查找的数据是在 SOAP 信封之后开始的。在您要查找的数据之后没有垃圾/不必要的内容。SOAP头并没有与XML声明(启动<?xml version=
等)。
一个简单的解决方案是找到 XML 文档的开头(您正在寻找的数据),并在此之前删除所有内容。
var startOfRealDocumentMarker = "<?xml version=\"1.0\"";
var startIndex = dirtyXmlString.IndexOf(startOfRealDocumentMarker);
if(startIndex == -1) {
throw new Exception("Start of XML not found. Now what?");
}
var cleanXmlString = dirtyXmlString.Substring(startIndex);
如果 SOAP 标头也有 XML 声明,您可以改为查找 SOAP 信封的结束标记。或者您可以开始在第二个字符处查找声明,这样您就可以跳过第一个字符。
这显然不是在所有情况下都有效的万无一失的解决方案。但也许它适用于您的所有情况?
如果您确定始终从输入文件的第 30 行开始读取会起作用,则可以改用此方法。
XmlDocument xDoc = new XmlDocument();
using (var rdr = new StreamReader(pathToXmlFile))
{
// Skip until reader is positioned at start of line 30
for (var i = 0; i < 29; ++i)
{
rdr.ReadLine();
}
// Load document from current position of reader
xDoc.Load(rdr);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句