3

私はこの質問が以前に同様の方法で尋ねられたことを知っていますが、私はこれを機能させることができないようです。

私はいくつかのxmlを持っています:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
    <Research xmlns="http://www.rixml.org/2005/3/RIXML" xmlns:xalan="http://xml.apache.org/xalan" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" createDateTime="2011-03-29T15:41:48Z" language="eng" researchID="MusiJvs3008">
    <Product productID="MusiJvs3008">
    <StatusInfo currentStatusIndicator="Yes" statusDateTime="2011-03-29T15:41:48Z" statusType="Published" />
    <Source>
    <Organization type="SellSideFirm" primaryIndicator="Yes">
    <OrganizationID idType="Reuters">9999</OrganizationID> 

そして、xpathを使用して値を読み取ろうとしています。

XPathDocument xmldoc = new XPathDocument(xmlFile); 
XPathNavigator nav = xmldoc.CreateNavigator(); 
XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
nsMgr.AddNamespace(string.Empty, "http://www.rixml.org/2005/3/RIXML"); 
XPathNavigator result = nav.SelectSingleNode("/Research", nsMgr); // <-- Returns null!

しかし、ルートノードを単純に選択しただけでもnullが返されます。名前空間に何か問題があると確信しています。誰か助けてもらえますか?

理想的には、xmlファイルから値を選択できる単純な行が必要です。

String a = xmlDoc.SelectSingleNode(@"/Research/Product/Content/Title").Value;

ところで、私はXMLファイルの内容を(直接)制御することはできません。

4

3 に答える 3

5

空の名前空間エイリアスを使用して、XPath式によって自動的に使用できるとは思いません。ただし、実際のエイリアスを使用するとすぐに機能するはずです。このテストは問題ありません。例:

using System;
using System.Xml;
using System.Xml.XPath;

class Test
{
    static void Main() 
    {
        string xmlFile = "test.xml";
        XPathDocument xmldoc = new XPathDocument(xmlFile); 
        XPathNavigator nav = xmldoc.CreateNavigator(); 
        XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
        nsMgr.AddNamespace("x", "http://www.rixml.org/2005/3/RIXML"); 
        XPathNavigator result = nav.SelectSingleNode("/x:Research", nsMgr);
        Console.WriteLine(result);
    }
}

ちなみに、 XPathとを使用する必要がありXPathDocumentますか?LINQ to XMLは、特に名前空間に関しては、はるかに快適なAPIであることに気付く傾向があります。.NET 3.5を使用していて、XPathを使用する必要がない場合は、チェックアウトすることをお勧めします。

于 2011-03-30T16:16:51.623 に答える
3

次の変更を行います

nsMgr.AddNamespace("x", "http://www.rixml.org/2005/3/RIXML"); 
XPathNavigator result = nav.SelectSingleNode("/x:Research", nsMgr);
于 2011-03-30T16:17:41.130 に答える
0

このコードのネイティブ版について、投稿して自分の質問に答えることができます。代わりに、最後に答えとして追加します。

ネイティブIXMLDOMDocument(バージョン6)オブジェクトを使用する場合:

//Give the default namespace as alias of "x"
document.setProperty("SelectionNamespaces","xmlns:x='http://www.rixml.org/2005/3/RIXML'");

//Query for the nodes we want
document.selectSingleNode("/x:Research");

ボーナス質問:名前空間が指定されていないのに、なぜ、なぜ、Xmlドキュメントオブジェクトモデルはデフォルトの名前空間をクエリしないのですか...ため息

于 2012-05-29T02:34:21.477 に答える