已解决 - C# XmlDocument LoadXML - 根级别的数据无效 - 删除隐藏的起始字符

问题描述 投票:0回答:1

我对服务进行 HTTP 调用,当我记录响应时,我看到下面的 XML(作为包含双引号的字符串)。我得到以下字符串作为外部 API 调用的响应,但我没有任何控制权。 我的 xmlstring 似乎以隐藏字符开头,我只需要删除该隐藏字符。

"<?xml version='1.0' encoding='UTF-8'?>
<PDB>
    <TRANSACTION_TYPE>
        <TYPE>ERROR</TYPE>
    </TRANSACTION_TYPE>
    <ERROR>
        <DESCRIPTION>Bad Input. Please check.</DESCRIPTION>
    </ERROR>
</PDB>"

我尝试了此处显示为链接的所有解决方案,但使用 .NET Framework 4.5.2 在 C# 中没有任何效果。

xml.LoadData - 根级别的数据无效。 1号线,位置1

为什么“根级别的数据无效。第1行,位置1。” XML 文档?

从 Windows Server 2012 中的更改开始

我正在调用一个我无法控制的 API。

完成

string responseData = reader.ReadToEnd();
后,在
responseData
中,我得到了如上所示的字符串。

我尝试了很多代码,但无论我尝试什么,每次我都会收到此错误:

System.Xml.XmlException:根级别的数据无效。 1号线,201号位置。

在 System.Xml.XmlTextReaderImpl.Throw(异常 e)
在 System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()
在 System.Xml.XmlTextReaderImpl.ParseDocumentContent()
在 System.Xml.XmlLoader.LoadDocSequence(XmlDocumentparentDoc)
在 System.Xml.XmlDocument.Load(XmlReader 阅读器)
在 System.Xml.XmlDocument.LoadXml(String xml)

这是我写的示例代码

  using (HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse())
  {
    if (response.StatusCode == HttpStatusCode.Created)
    {
      using (var respStream = response.GetResponseStream())
      {
        using (var reader = new System.IO.StreamReader(respStream, true))
         {
           string responseData = reader.ReadToEnd(); 
           if (responseData.Contains(@"<TYPE>ERROR</TYPE>"))
           {
             string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
              if (responseData.StartsWith(_byteOrderMarkUtf8, StringComparison.Ordinal))
               {
                 log.DebugFormat("responseData starts with HIDDEN : {0}", _byteOrderMarkUtf8); // in my logs I see ? character
                 **// it seems I have ? at start of my string and need to delete this only. But when I try to delete first character it deletes double quote.
               }                
             XmlDocument doc = new XmlDocument();
             doc.LoadXml(responseData);
            }
          }
      }
   }
}

更新解决方案

我采取了获取

<PDB> and </PBD>
之间的文本的路线,并将其用于 LoadXml() ,如下所示

using (var reader = new System.IO.StreamReader(respStream, true))
{
  
  string responseData = reader.ReadToEnd(); 
  if (responseData.Contains(@"<TYPE>ERROR</TYPE>"))
  {
    int pFrom = responseData.IndexOf("<PDB>");
    int pTo = responseData.LastIndexOf("</PDB>");

    string subresponseData = responseData.Substring(pFrom, (pTo - pFrom) + "</PDB>".Length);
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(subresponseData);
  }
}
c# loadxml
1个回答
0
投票

从 XML 字符串中删除双引号,它就会被简单地解析。即:

void Main()
{
    XDocument.Parse(myxml).Dump();
}


static readonly string myxml = "<?xml version='1.0' encoding='UTF-8'?><PDB><TRANSACTION_TYPE><TYPE>ERROR</TYPE></TRANSACTION_TYPE><ERROR><DESCRIPTION>Bad Input. Please check.</DESCRIPTION></ERROR></PDB>";

您可以在 LinqPad(有免费版本)中粘贴并运行它。输出显示为:

<PDB>
  <TRANSACTION_TYPE>
    <TYPE>ERROR</TYPE>
  </TRANSACTION_TYPE>
  <ERROR>
    <DESCRIPTION>Bad Input. Please check.</DESCRIPTION>
  </ERROR>
</PDB>
© www.soinside.com 2019 - 2024. All rights reserved.