使用 C# 解析格式错误的 XML-SOAP

我有需要解析的格式错误的 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章