1

さらに別の XPath/XmlNamespaceManager の質問をするのは嫌いですが、これを理解できないようです。

XPath "//FuelGradeMovement" を使用してノードを正しく検出できる XpathVisualizer ツールを使用しました。名前空間を認識し、XPath をそのように評価しました。

ノード「 FuelGradeMovement 」が存在するかどうかのみを確認したい。簡単です。しかし、いいえ、うまくいきません。

明らかに、私が xpath しているノードにはプレフィックスさえありませんが、名前空間マネージャーを使用しないと、ドキュメント内の他のノードにプレフィックスがあるため、実行時エラーが発生します。

名前空間では、何らかの理由でノードが表示されません。

このドキュメントを解析しようとしています:

    <?xml version="1.0"?>
<NAXML-MovementReport version="3.4" xmlns="http://www.naxml.org/POSBO/Vocabulary/2003-10-16" xmlns:radiant="http://www.radiantsystems.com/NAXML-Extension" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.naxml.org/POSBO/Vocabulary/2003-10-16 NAXML-PBI34RadiantExtended.xsd">
    <TransmissionHeader>....
    </TransmissionHeader>
    <FuelGradeMovement/>
</NAXML-MovementReport>

このコードを使用して:

    using ( var fs = file.OpenRead() )
{
    var x = new XPathDocument( fs );

    var nav = x.CreateNavigator();
    var mgr = new XmlNamespaceManager( nav.NameTable );

    mgr.AddNamespace( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
    mgr.AddNamespace( "xmime", "http://www.w3.org/2005/05/xmlmime" );
    mgr.AddNamespace( "radiant", "http://www.radiantsystems.com/NAXML-Extension" );
    mgr.AddNamespace( "ns1", "http://www.naxml.org/POSBO/Vocabulary/2003-10-16" );

    var iterator = nav.Select( "//FuelGradeMovement", mgr );

    return iterator.Count > 0;
}

非常に多くの組み合わせを試しましたが、間違いは見当たりません。誰でも助けることができますか?

ありがとうございました!

4

1 に答える 1

3

名前空間マネージャーを指定していますが、名前空間は指定していません。要素はその親から名前空間 URIFuelGradeMovementを継承している"http://www.naxml.org/POSBO/Vocabulary/2003-10-16"ので、次のことが必要だと思います。

var iterator = nav.Select("//ns1:FuelGradeMovement", mgr);

要素が名前空間プレフィックスを指定していないからといって、それが名前空間にないというわけではありません。

複雑な XPath クエリが本当に必要な場合を除き、LINQ to XML を使用すると、これらすべてが非常に簡単になることに注意してください。例えば:

var doc = XDocument.Load(fs);
XNamespace ns = "http://www.naxml.org/POSBO/Vocabulary/2003-10-16";
return doc.Descendants(ns + "FuelGradeMovement").Any();
于 2015-02-17T15:56:06.770 に答える