【问题标题】:Window.Data.Xml.Dom.XmlDocument does not support <!Doctype or <!CDATAWindow.Data.Xml.Dom.XmlDocument 不支持 <!Doctype 或 <!CDATA
【发布时间】:2018-05-20 12:10:20
【问题描述】:

我正在尝试使用 Windows 10 通用平台中包含的 Window.Data.Xml.Dom 命名空间加载 XML 文件。我必须这样做,因为我需要使用 XSTLTranslator 转换此 XML

我正在使用以下代码来实现:

var xslfile = Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(xslFilePath)
               .GetAwaiter().GetResult();
var xslDocument = XmlDocument.LoadFromFileAsync(xslfile).GetAwaiter().GetResult();

var xsltPocessor = new Windows.Data.Xml.Xsl.XsltProcessor(xslDocument);
var xmlDocumentToTransform = new XmlDocument();
xmlDocumentToTransform.LoadXml(xmlToTransform);
var generatedHtml = xsltPocessor.TransformToString(xmlDocumentToTransform);

我的问题显然是当我尝试使用

将 XML 加载到 XML 文档中时
var xmlDocumentToTransform = new XmlDocument();
xmlDocumentToTransform.LoadXml(xmlToTransform); 

在转换它之前,我收到错误 0xC00CE584。请参阅下面的 XML 示例:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE dmodule[

<!NOTATION cgm PUBLIC "-//USA-DOD//NOTATION Computer Graphics Metafile//EN">
<!NOTATION jpeg PUBLIC "+//ISBN 0-7923-9432-1::Graphic Notation//NOTATION 
Joint Photographic Experts Group Raster//EN">
<!NOTATION swf PUBLIC "-//S1000D//NOTATION X-SHOCKWAVE-FLASH 3D Models 
Encoding//EN">
<!NOTATION png PUBLIC "-//W3C//NOTATION Portable Network Graphics//EN">
]>
<dmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:dc="http://www.purl.org/dc/elements/1.1/" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
   xmlns:xlink="http://www.w3.org/1999/xlink" 
   xsi:noNamespaceSchemaLocation="http://www.s1000d.org/S1000D_4-
   1/xml_schema_flat/proced.xsd">
   <rdf:Description>
      <dc:title>Tire - Remove and install a new item</dc:title>
   </rdf:Description>
</dmodule>

我认为错误来自标头中的 !Doctype 节点,因为一旦我删除此信息,我在解析 xml 时就没有任何错误。这是预期的行为还是错误?在经典 .Net 中,我没有收到此错误。

PS : XML 来自作为 S1000D 规范示例的示例提供的自行车数据集

【问题讨论】:

标签: uwp win-universal-app xmldocument


【解决方案1】:

如果您将代码包装在 try-catch 中,您应该能够看到更多描述错误:

        try
        {
            var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync("test.xml");
            var content = await Windows.Storage.FileIO.ReadTextAsync(file);
            var xmlDocumentToTransform = new XmlDocument();
            xmlDocumentToTransform.LoadXml(content);
        }
        catch (Exception ex)
        {
            var dlg = new MessageDialog(ex.ToString());
            await dlg.ShowAsync();
        }

在这种情况下,错误是:

解决方案是(正如 Barry 在评论中指出的那样)将 DtdProcessing-property 设置为 Ignore(或 Parse,如果框架支持它),如下所示:

            var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync("testi.xml");
            var xmlDoc = new XmlDocument();

            var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore };
            using (var openRead = await file.OpenReadAsync())
            {
                using (var stream = openRead.AsStreamForRead())
                {
                    using (var reader = XmlReader.Create(stream, settings))
                    {
                        xmlDoc.Load(reader);
                    }
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2022-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多