2011-01-18 2 views
6

を働いていない発現は、私からの情報を取得していますいずれかと一致例のXMLドキュメントされています。ここではC#のXPathヘルプ - ここ

<?xml version="1.0" standalone="yes"?> 
<Products xmlns="http://tempuri.org/Products.xsd"> 
    <Movies> 
    <Title>Title1</Title> 
    <Language>English</Language> 
    </Movies> 
    <Movies> 
    <Title>Title2</Title> 
    <Language>English</Language> 
    </Movies> 
    <Movies> 
    <Title>Title3</Title> 
    <Language>French</Language> 
    </Movies> 
    <Books> 
    <Title>BTitle1</Title> 
    <Genre>Suspense</Genre> 
    </Books> 
    <Books> 
    <Title>BTitle2</Title> 
    <Genre>Suspense</Genre> 
    </Books> 
    <Books> 
    <Title>BTitle3</Title> 
    <Genre>SciFi</Genre> 
    </Books> 
    <Books> 
    <Title>BTitle4</Title> 
    <Genre>SciFi</Genre> 
    </Books> 
</Products> 

はサスペンスのジャンルにすべての書籍を取得するための私のコードです:

//Get state list using XPath 
XPathDocument xDoc = new XPathDocument(xmlPath); //Path to my file 
XPathNavigator xNav = xDoc.CreateNavigator(); 
string booksQuery = "Books[Genre = \"Suspense\"]"; 
XPathNodeIterator xIter = xNav.Select(booksQuery); 

while (xIter.MoveNext()) 
{ 
    //do stuff with xIter.Current 
} 

Products/Books[Genre = \"Suspense\"],Products/Books,./BooksおよびBooksを含むいくつかのクエリを試しました。 My xIterには常に項目がありません。

私はXPathを初めて使いました。本当にシンプルなエラーだとは思いますが、そうではないかもしれません。 myDataSet.ReadXml(myXmlPathString);を使用してこのXMLファイルの[Movies]と[Books]テーブルを持つDataSetを取得できるので、XMLファイルが破損していないことが分かります。それが何かを助けるなら。

だから、私の質問...私は間違っていますか?

+0

一重引用符を試しましたか? Genre = \ 'Suspense \'? – funkymushroom

+0

終了タグが変更されました – Rozuur

+0

@Rozuur - 申し訳ありませんが、誤植。修正しました。 @funkymushroom - 私はしませんでした。私はそれを試みます。 –

答えて

10
XPathDocument xDoc = new XPathDocument(xmlPath); //Path to my file 
XPathNavigator xNav = xDoc.CreateNavigator(); 
XmlNamespaceManager mngr = new XmlNamespaceManager(xNav.NameTable); 
mngr.AddNamespace("p", "http://tempuri.org/Products.xsd"); 
string booksQuery = "//p:Books[p:Genre = \"Suspense\"]"; 
XPathNodeIterator xIter = xNav.Select(booksQuery,mngr); 
+0

Upvoted '彼は約30秒で最初にそこにいた:-( –

+0

@Andy、ありがとう。あまりにも私たちのどちらもジョンスケーターと競争することはできません:) – theChrisKent

+0

あなたに教えてください;その男はマシンです! –

6

あなたは名前空間にないBooksという要素を探しています。 Products要素は、その要素とそのすべての子孫の既定の名前空間を設定しています。 XPathで名前空間を使用する必要があります.LINQ to XMLのように、クエリに別の方法を使用する必要があります。 (個人的に私は、XPathよりもはるかに対処する簡単にXML にLINQを見つける - あなたが関与して名前空間を取得する必要がある場合は特に。)

+0

XPathで名前空間リゾルバを使用するにはどうすればよいですか?ありがとう。 – Rozuur

+0

残念ながら、私はこのプロジェクトで.NET 2.0に制約されています。クエリに名前空間を使用するにはどうすればよいですか? –

+0

@Mike:例についてはtheChrisKentの回答を参照してください。 –

2

ジョンは、名前空間が不足している言ったように。 VTD-XMLで

//Get state list using XPath 
XPathDocument xDoc = new XPathDocument(xmlPath); //Path to my file 
XPathNavigator xNav = xDoc.CreateNavigator(); 
XmlNamespaceManager xmlns = new XmlNamespaceManager(xNav.NameTable); 
xmlns.AddNamespace("p", "http://tempuri.org/Products.xsd"); 
string booksQuery = "//p:Books[p:Genre = 'Suspense']"; 
XPathNodeIterator xIter = xNav.Select(booksQuery, xmlns); 

while (xIter.MoveNext()) 
{ 
    //do stuff with xIter.Current 
} 
0

を次のようにあなたがC#でこれを行うことができます

、名前空間がはるかに簡単です...あなたは、名前空間を無視するかしないかを選択することができます。

VTDGen vg = new VTDGen(); 
if(vg.parseFile("product.xml",true)){ 
    VTDNav vn = vg.getNav(); 
    AutoPilot ap = new AutoPilot(vn); 
    ap.selectXPath("Produt[Genre='suspence']"); 
    int i = -1; 
    while ((i = ap.evalXPath()) != -1) 
    { 
        // processing logic 
    } 
}