C# 用C解析格式错误的XML-SOAP#
我有一个格式不正确的XML(SOAP)文件需要解析。问题是XML没有正确的头标记 我曾尝试使用XDocument和XmlDocument解析文件,但两者都不起作用。XML从第30行开始,所以在XML解析器读取文件之前,是否有某种方法跳过这些行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
<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);
}