繁体   English   中英

XDocument将不会解析html实体(例如),但XmlDocument将

[英]XDocument will not parse html entities (e.g. ) but XmlDocument will

我目前正在将在XmlDocument上运行的旧解析器转换为XDocument。 我这样做主要是为了获取Linq查询和添加的行号信息。

我的xml包含这样的元素:

<?xml version="1.0"?>
<fulltext>
    hello this is a failed textnode
    &#xC;
    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);
}

由于字符&#xC;无法读取文档&#xC; 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 -字符/

它不会删除我之前提到的字符,但是会删除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格式正确,并且在许多情况下会在代码的其他地方引发异常。 我之所以只使用它,是因为我无法更改客户发送给我们的内容,因此必须原样阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM