0

OK、私は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をダウンロードしてローカルファイルを作成するだけで、Webに出て行くのに無駄になっている時間を節約できるかどうかということでした。残念ながら、AddNamespaceがないと、xpathは機能しません。

私はこれをウェブ上で調査しましたが、これに対する解決策を見つけることができませんでした。xmlは内部で作成されるので、現時点でWebから最新のスキーマを取得することについてあまり心配していません。サービスからタイムリーにデータを生成することについて、私はもっと心配しています。たぶん私は完全に間違っていて、これは不可能ですが、プログラム的に言えば、これが以前にどのように行われたかはわかりません。

4

2 に答える 2

0

ローカルファイルを使用すると正常に動作するはずです。

注:名前空間URIは、パーサーが情報を検索するために使用することはありません。

目的は、名前空間に一意の名前を付けることです。ただし、多くの場合、企業は名前空間を名前空間情報を含むWebページへのポインタとして使用します。

From: Xml名前空間について

于 2012-10-17T22:57:27.527 に答える
0

結局、独自のxmlresolverクラスを作成し、それに関連付けられたdtdと一連のmodファイルをローカルにダウンロードする必要がありました。次に、xmldocument.loadを実行するのではなく、次のようなことを実行します。:

            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);
                }
            }

その場合、クラスはmyXmlResolverクラスでは次のようになります。

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

     }
    }
}

* *私はウェブ上のたくさんの例から少しずつ取ったので、個人的なメモはすべての信用を得ることができません。

于 2012-10-26T22:33:54.067 に答える