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

C# 用C解析格式错误的XML-SOAP#,c#,xml,parsing,soap,xml-parsing,C#,Xml,Parsing,Soap,Xml Parsing,我有一个格式不正确的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" xmln

我有一个格式不正确的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设置=新的XmlReaderSettings();
settings.ConformanceLevel=ConformanceLevel.Fragment;
XmlReader r=XmlReader.Create(file.FullName,设置);
XmlDocument xDoc=新的XmlDocument();
xDoc.PreserveWhitespace=true;
xDoc.LoadXml(“”);
xDoc.DocumentElement.CreateNavigator().AppendChild(r);
XmlNamespaceManager=newxmlnamespacemanager(xDoc.NameTable);

一旦尝试解析,我就会得到:意外的xml声明。xml声明必须是文档中的第一个节点……

如果我理解正确,那么您要查找的数据将在SOAP信封之后开始。您要查找的数据之后没有垃圾/不必要的内容。
SOAP头不是以XML声明开头的(
),如果我理解正确,那么您要查找的数据是从SOAP信封后面开始的。您要查找的数据后面没有垃圾/不必要的内容。

SOAP头不以XML声明开头(
这是SOAP消息数据中的新XML声明吗?除非您从消息中剪切了CDATA标记,否则我认为没有任何方法可以让任何XML解析器接受这一点。不,文件中没有任何CDATA标记。我编辑了第一条消息以更好地了解SOAP头。有…@sukkis我不太理解XML看起来是静止的。你是说先有一个SOAP头,然后是一个完整的XML文档,你想扔掉SOAP头吗?在你要查找的XML之后没有SOAP信封吗?在这种情况下,这似乎可以通过一个简单的
子字符串
方法调用来解决。@sukkis我添加了一个跳转到l的替代方法ine 30.SOAP消息数据中是否有新的XML声明?除非您从消息中剪切了CDATA标记,否则我认为没有任何方法可以让任何XML解析器接受这一点。不,文件中没有任何CDATA标记。我稍微编辑了第一条消息,以便更好地了解SOAP头。有…@sukkis我不太理解XML看起来是静止的。你是说先有一个SOAP头,然后是一个完整的XML文档,你想扔掉SOAP头吗?在你要查找的XML之后没有SOAP信封吗?在这种情况下,这似乎可以通过一个简单的
子字符串
方法调用来解决。@sukkis我添加了一个跳转到l的替代方法第30页。
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);
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);
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);
}