0

好的,我对使用 xml、xpath 等还是很陌生。

我正在编写一个将从队列中获取信息的 Windows 服务。它将处理此信息,并且此信息的部分处理是在我正在创建的 xmldocument 上使用 xpath,而不是加载。

代码片段。:

XmlDocument _xmlDocument = new XmlDocument();
_xmlDocument.Load(svgFile);
_xmlNamespaceManager = new XmlNamespaceManager(_xmlDocument.NameTable);
_xmlNamespaceManager.AddNamespace("svg", "http://www.w3.org/2000/svg");

在上面的代码片段之后,我正在做一些 xpath 功能,我需要使用它,因为有一些预先编写的功能可以为我节省大量时间。

这是真正的问题,当我使用上面的 AddNamespace 时,它​​会输出到该 uri 并占用太多时间(验证等)。我的想法是,如果我可以下载 DTD 并创建一个本地文件,这样可以节省浪费在网络上的时间。不幸的是,没有 AddNamespace xpath 将无法工作。

我在网上对此进行了研究,但无法找到解决方案。xml 是在内部创建的,所以我现在不太担心网络上的最新模式。我更担心及时从服务中生成数据。也许我完全错了,这是不可能的,但是从编程上讲,我看不出以前是怎么做到的。

4

2 回答 2

0

使用本地文件应该可以正常工作:

注意:解析器不使用命名空间 URI 来查找信息。

目的是给命名空间一个唯一的名称。然而,公司通常使用命名空间作为指向包含命名空间信息的网页的指针。

来自: 关于 Xml 命名空间

于 2012-10-17T22:57:27.527 回答
0

I ended up having to create my own xmlresolver class and then downloading the dtd and a bunch of mod files associated with it locally. Then rather than doing an xmldocument.load, you perform something like the below. :

            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.DTD;
            settings.ProhibitDtd = false;
            settings.XmlResolver = new MyCoolResolver();
            binDirectory = binDirectory + "/content";
            string myFileLocation = binDirectory + "/MyFile.svg";

            using (XmlReader reader = XmlReader.Create(myFileLocation , settings))
            {
                try
                {
                    while (reader.Read())
                    {
                        _xmlDocument.Load(reader);
                    }
                }
                catch (XmlException e)
                {
                    Console.WriteLine(e.Message);
                }
            }

Then your class is just something like this for your myXmlResolver class.

namespace ReallyCoolProject
{
    public class MyCoolResolver : XmlUrlResolver
    {
         public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
         {
            string binDirectory =               Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
            binDirectory = binDirectory + "/mods";

            if (absoluteUri.OriginalString.Contains("-//W3C//DTD SVG 1.1//EN"))
            {
                return File.Open(binDirectory + "/svg11.dtd", FileMode.Open);
            }

            if (absoluteUri.OriginalString.Contains("-//W3C//ENTITIES SVG 1.1 Document Model//EN"))
            {
                return File.Open(binDirectory + "/svg11-model.mod", FileMode.Open);
        }

        //.....many many more mod files than this

     }
    }
}

**Personal note can't take all the credit as I took bits and pieces from a bunch of examples on the web.

于 2012-10-26T22:33:54.067 回答