XDocument不会解析html实体(例如&;#xC;),但XmlDocument会解析
本文关键字:#xC XmlDocument amp 例如 html 实体 XDocument | 更新日期: 2023-09-27 17:57:28
我目前正在将在XmlDocument上运行的旧解析器转换为XDocument。我这样做主要是为了获得Linq查询和添加的行号信息。
我的xml包含这样一个元素:
<?xml version="1.0"?>
<fulltext>
hello this is a failed textnode

and I don't know how to parse it.
</fulltext>
我的问题是,虽然XmlDocument用读取该节点似乎没有问题
var xmlDocument = new XmlDocument();
var physicalPath = GetPhysicalPath(uploadFolderFile);
try
{
xmlDocument.Load(physicalPath);
}
catch (XmlException xmlException)
{
_log.Warn("Problems with the document", xmlException);
}
上面的例子很好地解析了文档,但当我尝试这样做时:
XDocument xmlDocument;
var physicalPath = GetPhysicalPath(uploadFolderFile);
var xmlStream = new System.IO.StreamReader(physicalPath);
try
{
xmlDocument = XDocument.Load(xmlStream, LoadOptions.SetLineInfo | LoadOptions.SetBaseUri);
}
catch (XmlException)
{
_log.Warn("Trying to clean document for HexaDecimal", xmlException);
}
由于字符
,无法读取文档在XML 1.1版本中似乎允许使用特殊字符,但更改描述并没有帮助。我曾考虑过使用XmlDocument解析文档,然后进行转换;但这似乎违反了直觉。有人能帮我解决这个问题吗?
好的。。。所以我找到了解决这个问题的办法。
首先,我尝试使用以下代码解析xml:
private XDocument GetXmlDocument(String physicalPath)
{
XDocument xmlDocument;
var xmlStream = new System.IO.StreamReader(physicalPath);
try
{
xmlDocument = XDocument.Load(xmlStream, LoadOptions.SetLineInfo);
}
catch (XmlException)
{
//_log.Warn("Trying to clean document for HexaDecimal", xmlException);
xmlDocument = XmlSanitizingStream.TryToCleanXMLBeforeParsing(physicalPath);
}
return xmlDocument;
}
如果它无法加载文档,那么我将尝试使用本文中使用的技术来清理它:http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
它不会删除我前面提到的字符,但会删除XML标准不允许的任何字符。
然后,在清理XML之后,我添加了一个XMLReader,并将其设置为不检查字符:
public static XDocument TryToCleanXMLBeforeParsing(String physicalPath)
{
string xml;
Encoding encoding;
using (var reader = new XmlSanitizingStream(File.OpenRead(physicalPath)))
{
xml = reader.ReadToEnd();
encoding = reader.CurrentEncoding;
}
byte[] encodedString;
if (encoding.Equals(Encoding.UTF8)) encodedString = Encoding.UTF8.GetBytes(xml);
else if (encoding.Equals(Encoding.UTF32)) encodedString = Encoding.UTF32.GetBytes(xml);
else encodedString = Encoding.Unicode.GetBytes(xml);
var ms = new MemoryStream(encodedString);
ms.Flush();
ms.Position = 0;
var settings = new XmlReaderSettings {CheckCharacters = false};
XmlReader xmlReader = XmlReader.Create(ms, settings);
var xmlDocument = XDocument.Load(xmlReader);
ms.Close();
return xmlDocument;
}
由于在将忽略字符添加到读取器之前,我已经清除了文档中的非法字符,因此我确信我没有读取格式错误的XML文档。最糟糕的情况是,我得到一个格式错误的XML,它无论如何都会抛出一个错误。
我只使用它进行解析,它应该只用于读取数据。这不会使XML格式良好,而且在许多情况下会在代码的其他地方引发异常。我之所以使用这个,是因为我无法更改客户发送给我们的内容,我必须按原样阅读。