Nasıl yapılır: DOM XPath ile sorgulama, ad boşluğu belirt

Makale çevirileri Makale çevirileri
Makale numarası: 294797 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Özet

Microsoft XML Ayrıştırıcı (MSXML) 3.0 yayımlanmasıyla birlikte, XPath XML belgeleri sorgulamak ve bir düğüm veya düğüm dönmek için uygun bir yoldur sağlar ayarlayın. ıxmldomnode nesnesinin selectSingleNode ve selectNodes yöntemleriyle XPath sorgusu kullandığınızda, nitelenmiş adlar kullanmanız gerekir. Örneğin, aşağıdaki XML verileri
<?xml version ="1.0"?>
<a:Books xmlns:a="x-schema:bookschema.xml" >
<a:Book>
  <title>Presenting XML</title>
  <author>Richard Light</author>
</a:Book>
</a:Books>
				
ilgili XPath sorgusu, birx-schema:bookschema.xml Tekdüzen Kaynak Tanımlayıcısı (URI) diğer ad olarak kullanıyoruz, aşağıda verilmektedir:
pXMLDoc->setProperty("SelectionNamespaces","xmlns:a='x-schema:bookschema.xml'");
pXMLDoc->documentElement->selectNodes("/a:Books/a:Book");
				
böyle bir durumda, tam ad kullanarak açıktır. Varsayılan ad boşluğu kullanılır, ancak tam adı'nı kullanarak aşağıdaki örnekte gösterildiği şekilde daha zor olabilir:
<?xml version ="1.0"?>
<Books xmlns="x-schema:bookschema.xml" >
<Book>
  <title>Presenting XML</title>
  <author>Richard Light</author>
</Book>
</Books>
				
önek düğüm etiketleri kullanıldığını unutmayın. Nitelenmiş ad XPath sorgusu hala kullanılmalıdır, aksi halde eşleşen hiçbir düğüm olduğundan (örneğin, /Books/Book) sorgu sonuç verir.

Daha fazla bilgi

Aşağıdaki örnek Visual C++ teknik göstermek için sağlanmıştır.

XPath ile DOM sorgulandığında, ad alanını belirtmek için <a0></a0>, aşağıdaki adımları izleyin:
  1. Win32 konsol proje oluşturmak ve yeni .cpp dosyası projeye ekleyin. .Cpp dosyasına aşağıdaki kodu yapıştırın ve dosyayı Test.cpp:
    #include <stdio.h>
    
    #import "msxml3.dll"
    using namespace MSXML2;
    
    void dump_com_error(_com_error &e);
    
    int main(int argc, char* argv[])
    {
    	CoInitialize(NULL);
    	try{
    		IXMLDOMDocument2Ptr pXMLDoc;
    		HRESULT hr = pXMLDoc.CreateInstance(__uuidof(DOMDocument));
    		
    		pXMLDoc->async = false; // default - true,
    		
    		pXMLDoc->validateOnParse = true;		
    		
    		hr = pXMLDoc->load("books.xml");
    	
    		if(hr!=VARIANT_TRUE)
    		{
    			IXMLDOMParseErrorPtr  pError;
    			
    			pError = pXMLDoc->parseError;
    			_bstr_t parseError =_bstr_t("At line ")+ _bstr_t(pError->Getline()) + _bstr_t("\n")+ 
                               _bstr_t(pError->Getreason());
    			MessageBox(NULL,parseError, "Parse Error",MB_OK);
    			return -1;
    		}
    		
    		hr = pXMLDoc->setProperty("SelectionLanguage", "XPath");
    		hr = pXMLDoc->setProperty("SelectionNamespaces", "xmlns:a='x-schema:bookschema.xml'");
    
    		IXMLDOMNodeListPtr pNodeList;
    		pNodeList = pXMLDoc->documentElement->selectNodes("/a:Books/a:Book");
    		int count = pNodeList->Getlength();
    		char pLength[64];
    		sprintf(pLength, "Total number of nodes selected is %d", count);
    		MessageBox(NULL,pLength,"Test", MB_OK);
    		
    	}
    	catch(_com_error &e)
    	{
    		dump_com_error(e);
    		return -1;
    	}
    	return 0;
    }
    
    void dump_com_error(_com_error &e)
    {
    	printf("Error\n");
    	printf("\a\tCode = %08lx\n", e.Error());
    	printf("\a\tCode meaning = %s", e.ErrorMessage());
    	_bstr_t bstrSource(e.Source());
    	_bstr_t bstrDescription(e.Description());
    	printf("\a\tSource = %s\n", (LPCSTR) bstrSource);
    	printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription);
    }
    
    					
  2. Aşağıdaki XML Books.xml Test.cpp aynı proje klasöre kaydedin.
    <?xml version ="1.0"?>
    <Books xmlns="x-schema:bookschema.xml" >
    <Book>
      <title>Presenting XML</title>
      <author>Richard Light</author>
      <pages>334</pages>
    </Book>
    <Book>
      <title>Mastering XML</title>
      <author>John Smith</author>
      <pages>209</pages>
    </Book>
    </Books>
    					
  3. Aşağıdaki XML Bookschema.xml Test.cpp aynı proje klasöre kaydedin.
    <?xml version="1.0"?>
    <Schema xmlns="urn:schemas-microsoft-com:xml-data">
      <ElementType name="title" />
      <ElementType name="author" />
      <ElementType name="pages" />
      <ElementType name="Book" model="closed">
        <element type="title" />
        <element type="author" />
        <element type="pages" />
      </ElementType>
      <ElementType name="Books" model="closed">
        <element type="Book" />
      </ElementType>
    </Schema>
    					
  4. Derleyip uygulamanın çalıştırın. Bir ileti kutusu XPath sorgusu tarafından döndürülen düğümlerin sayısını gösterir.
Şunları unutmayın:
  • Aynı örnek kodu ile açık bir URI ad alanı olarak kullanılabilir.
  • Aşağıdaki satırları
    IXMLDOMDocument2Ptr pXMLDoc;
    ...
    hr = pXMLDoc->setProperty("SelectionLanguage", "XPath");
    hr = pXMLDoc->setProperty("SelectionNamespaces", "xmlns:a='x-schema:bookschema.xml'");
    ...
    pNodeList = pXMLDoc->documentElement->selectNodes("/a:Books/a:Book");
    					
    ıxmldomdocument'in arabirimiyle setProperty yöntem kullanılamaz.
Bir tam adı (QName), bir önek ve yerel bir bölümü oluşur. Önek, nitelenmiş ad ad alanı önekini sağlar ve ad alanı URI ile ilişkilendirilmesi gerekir.

Referanslar

Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
288147SORUN: XPath Query'ye karşı bir User-Defined varsayılan ad boşluğu kullanma

Özellikler

Makale numarası: 294797 - Last Review: 13 Temmuz 2004 Salı - Gözden geçirme: 1.2
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft XML Parser 3.0
  • Microsoft XML Parser 3.0 Service Pack 1
  • Microsoft XML Core Services 4.0
Anahtar Kelimeler: 
kbmt kbhowto KB294797 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:294797

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com