Фильтрация XML через XMLFilter в Excel, но неправильный XPath - PullRequest
0 голосов
/ 15 января 2020

У меня есть XML, из которого я хочу отфильтровать заголовок и сообщение.

Это XML:

<?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>

Я пытался использовать функцию XMLFILTER из Excel , но мой XPath неверен:

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

Как я могу получить правильный xpath в этом случае, так как Title находится внутри содержимого?

Ответы [ 2 ]

1 голос
/ 16 января 2020

Для аргумента xPath в Excel вы должны использовать пространство имен:

Полный путь:

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

В вашем конкретном случае вы можете более просто использовать:

//d:Title
//d:Email
1 голос
/ 15 января 2020

TLDR / из комментариев : Excel не заботится о пространствах имен. Повторно используйте префиксы в источнике XML и игнорируйте пространство имен по умолчанию ...

//content/m:properties/d:Title

Возможно, потому что у вашего XML есть пространства имен.

content находится в пространстве имен по умолчанию http://www.w3.org/2005/Atom.

properties находится в пространстве имен http://schemas.microsoft.com/ado/2007/08/dataservices/metadata с префиксом m.

Title находится в пространстве имен http://schemas.microsoft.com/ado/2007/08/dataservices привязано к префиксу d.

Я не уверен, как Excel / XMLFILTER обрабатывает пространства имен в XPath (надеюсь, кто-то ответит, что делает), но в идеале вы должны связать эти Пространство имен Uris для префиксов и использовать префиксы в XPath.

Если вы не можете, вам, вероятно, придется прибегнуть к использованию local-name () ...

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

Если есть возможность элементов с тем же локальным именем, но с разными пространствами имен (и вам нужно различать guish между ними), вы также можете использовать 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']

Конечно, все это предполагает что эти две функции XPath 1.0 поддерживаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...