Saya memiliki XML dari mana saya ingin memfilter Judul dan EMail.

Ini XMLnya:

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xml:base="https://mysite/vis/_api/">
   <id>https://mysite/vis/_api/Web/GetUserById(1284)</id>
   <category term="SP.User" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
   <link rel="edit" href="Web/GetUserById(1284)" />
   <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Groups" type="application/atom+xml;type=feed" title="Groups" href="Web/GetUserById(1284)/Groups" />
   <title />
   <updated>2020-01-15T18:23:48Z</updated>
   <author>
      <name />
   </author>
   <content type="application/xml">
      <m:properties>
         <d:Id m:type="Edm.Int32">1284</d:Id>
         <d:IsHiddenInUI m:type="Edm.Boolean">false</d:IsHiddenInUI>
         <d:LoginName>i:0#.w|opmain\xespsa</d:LoginName>
         <d:Title>Alex, Johnson</d:Title>
         <d:PrincipalType m:type="Edm.Int32">1</d:PrincipalType>
         <d:Email>Alex.Johnson@stackoverflow.net</d:Email>
         <d:IsSiteAdmin m:type="Edm.Boolean">false</d:IsSiteAdmin>
         <d:UserId m:type="SP.UserIdInfo">
            <d:NameId>s-1-5-21-1377870913-3677095212-3270174719-20443</d:NameId>
            <d:NameIdIssuer>urn:office:idp:activedirectory</d:NameIdIssuer>
         </d:UserId>
      </m:properties>
   </content>
</entry>

Saya mencoba menggunakan fungsi XMLFILTER dari Excel, tetapi XPath saya salah:

=XMLFILTERN(E4;"//content/title[1]")

Bagaimana saya bisa mendapatkan xpath yang benar dalam kasus ini karena Judul ada di dalam konten?

0
user10930711 15 Januari 2020, 23:31

2 jawaban

Jawaban Terbaik

TLDR/dari komentar: Excel tidak peduli dengan ruang nama. Gunakan kembali awalan di XML sumber dan abaikan namespace default...

//content/m:properties/d:Title

Mungkin karena XML Anda memiliki ruang nama.

content ada di namespace default http://www.w3.org/2005/Atom.

properties berada di namespace http://schemas.microsoft.com/ado/2007/08/dataservices/metadata terikat dengan awalan m.

Title ada di namespace http://schemas.microsoft.com/ado/2007/08/dataservices terikat dengan awalan d.

Saya tidak yakin bagaimana Excel/XMLFILTER menangani ruang nama di XPath (semoga seseorang menjawabnya), tetapi idealnya Anda akan mengikat uris namespace tersebut ke awalan dan menggunakan awalan di XPath.

Jika tidak bisa, Anda mungkin harus menggunakan nama-lokal()...

//*[local-name()='content']/*[local-name()='properties']/*[local-name()='Title']

Jika ada kemungkinan elemen dengan nama lokal yang sama, tetapi ruang nama berbeda (dan Anda perlu membedakannya), Anda juga dapat menggunakan namespace-uri()...

//*[local-name()='content' and namespace-uri()='http://www.w3.org/2005/Atom']/*[local-name()='properties' and namespace-uri()='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata']/*[local-name()='Title' and namespace-uri()='http://schemas.microsoft.com/ado/2007/08/dataservices']

Tentu saja ini semua dengan asumsi bahwa kedua fungsi XPath 1.0 tersebut didukung.

1
Daniel Haley 16 Januari 2020, 01:10

Untuk argumen xPath di Excel, Anda harus menggunakan namespace:

Jalur lengkap:

//content/m:properties/d:Title
//content/m:properties/d:Email

Dalam contoh khusus Anda, Anda dapat lebih sederhana menggunakan:

//d:Title
//d:Email
1
Ron Rosenfeld 16 Januari 2020, 00:39