2 回答

TA貢獻1775條經驗 獲得超11個贊
我知道的唯一方法是擺脫非法的第二次<?xml>聲明。我寫了一個示例,它將簡單地查找并丟棄第二個<?xml>. 之后該字符串成為有效的 XML 并且可以被解析。您可能需要稍微調整一下以使其適用于您的具體情況。
代碼:
using System;
using System.Xml;
public class Program
{
public static void Main()
{
var badXML = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<Data>
<Items>
<Item>
<Target type=""System.String"">Some target</Target>
<Content type=""System.String""><?xml version=""1.0"" encoding=""utf-8""?><Data><Items><Item><surname type=""System.String"">Some Surname</surname><name type=""System.String"">Some Name</name></Item></Items></Data></Content>
</Item>
</Items>
</Data>";
var goodXML = badXML.Replace(@"<Content type=""System.String""><?xml version=""1.0"" encoding=""utf-8""?>"
, @"<Content type=""System.String"">");
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(goodXML);
XmlNodeList itemRefList = xmlDoc.GetElementsByTagName("Content");
foreach (XmlNode xn in itemRefList)
{
Console.WriteLine(xn.InnerXml);
}
}
}
輸出:
<Data><Items><Item><surname type="System.String">Some Surname</surname><name type="System.String">Some Name</name></Item></Items></Data>
工作 DotNetFiddle:https ://dotnetfiddle.net/ShmZCy
<![CDATA[ .... ]]>也許不用說:如果創建這個無效 XML 的東西應用通用規則將嵌套的 XML 包裝在一個塊中,那么就不需要所有這些了。

TA貢獻1864條經驗 獲得超2個贊
<?xml ...?>
處理聲明僅在 XML 文檔的第一行有效,因此您得到的 XML 不是格式正確的 XML 。這將使在不更改源文檔(并且您已經指出這是不可能的)或預處理源文檔的情況下很難按原樣進行解析。
你可以試試:
用正則表達式或字符串操作剝離
<?xml ?>
指令,但那里的治療可能比疾病更糟糕。實現更寬容的解析器的 HTMLAgilityPack可以處理 XML 文檔
除此之外,文檔的制作者應該著眼于生成格式良好的 XML:
CDATA
sections 可以幫助做到這一點,但請注意CDATA
不能包含]]>
結束標記。轉義 XML 文本的 XML 可以正常工作;也就是說,使用標準例程來
<
轉換<
等等。XML 命名空間在這里也可以提供幫助,但一開始它們可能會讓人望而生畏。
- 2 回答
- 0 關注
- 303 瀏覽
添加回答
舉報