2017-04-04 32 views
0

在下面的XML片段...如何從XML文件中提取與其他字符串共享相同標記的特定字符串?

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xml" href="/static/atom.xsl"?> 
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:s="http://dev.splunk.com/ns/rest" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"> 
    <title>serverclients</title> 
    <id>https://splfwdprw2:8089/servicesNS/nobody/search/deployment/server/clients</id> 
    <updated>2017-04-04T16:14:04-04:00</updated> 
    <generator build="f3e41e4b37b2" version="6.3.1"/> 
    <author> 
    <name>Splunk</name> 
    </author> 
    <link href="/servicesNS/nobody/search/deployment/server/clients/_acl" rel="_acl"/> 
    <link href="/servicesNS/nobody/search/deployment/server/clients/countClients_by_machineType" rel="countClients_by_machineType"/> 
    <link href="/servicesNS/nobody/search/deployment/server/clients/countRecentDownloads" rel="countRecentDownloads"/> 
    <link href="/servicesNS/nobody/search/deployment/server/clients/getMatchingAppsForClient_dryRun" rel="getMatchingAppsForClient_dryRun"/> 
    <link href="/servicesNS/nobody/search/deployment/server/clients/preview" rel="preview"/> 
    <opensearch:totalResults>1</opensearch:totalResults> 
    <opensearch:itemsPerPage>18446744073709551615</opensearch:itemsPerPage> 
    <opensearch:startIndex>0</opensearch:startIndex> 
    <s:messages/> 
    <entry> 
    <title>00031e8f6c883544b8079037c5eba9ec</title> 
    <id>https://splfwdprw2:8089/servicesNS/nobody/search/deployment/server/clients/00031e8f6c883544b8079037c5eba9ec</id> 
    <updated>2017-04-04T16:14:04-04:00</updated> 
    <link href="/servicesNS/nobody/search/deployment/server/clients/00031e8f6c883544b8079037c5eba9ec" rel="alternate"/> 
    <author> 
     <name>system</name> 
    </author> 
    <link href="/servicesNS/nobody/search/deployment/server/clients/00031e8f6c883544b8079037c5eba9ec" rel="list"/> 
    <link href="/servicesNS/nobody/search/deployment/server/clients/00031e8f6c883544b8079037c5eba9ec" rel="remove"/> 
    <content type="text/xml"> 
     <s:dict> 
     <s:key name="applications"> 
      <s:dict> 
      <s:key name="all_deploymentclient"> 
       <s:dict> 
       <s:key name="action">Phonehome</s:key> 
       <s:key name="archive">/opt/splunk/var/run/tmp/all_deploymentclient/all_deploymentclient-1491320471.bundle</s:key> 
       <s:key name="checksum">0</s:key> 
       <s:key name="excludeFromUpdate"></s:key> 
       <s:key name="failedReason"></s:key> 
       <s:key name="issueReload">0</s:key> 
       <s:key name="restartSplunkWeb">0</s:key> 
       <s:key name="restartSplunkd">1</s:key> 
       <s:key name="result">Ok</s:key> 
       <s:key name="serverclasses"> 
        <s:list> 
        <s:item>all_deploymentclient</s:item> 
        </s:list> 
       </s:key> 
       <s:key name="size">10240</s:key> 
       <s:key name="stateOnClient">enabled</s:key> 
       <s:key name="timestamp">Tue Apr 4 11:42:54 2017</s:key> 
       </s:dict> 
      </s:key> 
      <s:key name="all_fwd_outputs_18indexers"> 
       <s:dict> 
       <s:key name="action">Phonehome</s:key> 
       <s:key name="archive">/opt/splunk/var/run/tmp/all_fwd/all_fwd_outputs_18indexers-1491320471.bundle</s:key> 
       <s:key name="checksum">0</s:key> 
       <s:key name="excludeFromUpdate"></s:key> 
       <s:key name="failedReason"></s:key> 
       <s:key name="issueReload">0</s:key> 
       <s:key name="restartSplunkWeb">0</s:key> 
       <s:key name="restartSplunkd">1</s:key> 
       <s:key name="result">Ok</s:key> 
       <s:key name="serverclasses"> 
        <s:list> 
        <s:item>all_fwd</s:item> 
        </s:list> 
       </s:key> 
       <s:key name="size">10240</s:key> 
       <s:key name="stateOnClient">enabled</s:key> 
       <s:key name="timestamp">Tue Apr 4 11:42:54 2017</s:key> 
       </s:dict> 
      </s:key> 

...我試圖提取任何「S:鍵名=」出現在下面的第一級字符串「S:鍵名=」應用程序「標籤,在這個例子中,我想要提取的字符串是」all_deploymentclient「和」all_fwd_outputs_18indexers「,如果額外的字符串出現在同一級別,我想要捕獲這些字符串。我正在使用xml_grep,但我不確定如何定義參數以獲得所需的結果(因爲有多個「s:key name =」標記的實例,其中一些實例可用作標題和有價值的其他人分配給他們)。

所以,當這一切都說過和做過,提取輸出這個例子應該是:

all_deploymentclient 
all_fwd_outputs_18indexers 

我怎樣才能做到這一點?是否需要另一個實用工具(如xpath)?

+0

「XML片段」是否完整?前綴's'是否在任何地方? (像'xmlns:s =「一些命名空間uri」'。) –

回答

0

考慮到@MichaelKay和@knb提供的信息,我能夠確定一個解決方案。最後我用xmlstarlet得到我所需要的信息如下:

xmlstarlet sel -T -t -m "//*[local-name()='key'][@name='applications']/*/*/@name" -v . -n <XML filename> 

這產生了以下的輸出:

all_deploymentclient 
all_fwd_outputs_18indexers 

感謝大家對他們的貢獻!

1

也許嘗試這第一個(快速和骯髒的方法來替代s:空間前綴):

cat /var/tmp/content.xml | sed 's/s://g' > cat /var/tmp/content2.xml 

然後嘗試

xmllint --xpath "//key[@name='all_deploymentclient' or @name='all_fwd_outputs_18indexers']/@name" /var/tmp/content2.xml \ 
| sed "s| name|\nname|g; s/name=\"//; s/\"\$//" 
+0

感謝您的輸入!當我閱讀你的回覆時,我意識到我沒有足夠清楚地描述我的問題,所以我已經相應地編輯了我的問題的描述。 –

1

當你做任何的搜索任何類型的數據源中的,僅僅知道實際數據是什麼(如果您知道,您不需要搜索它)是不夠的:您需要知道它可能與示例所示的不同。

所以我們必須看看你對問題的描述:「s:key name =」出現在「s:key name =」應用程序「標籤」之後的縮進中的字符串,試着理解你的意思通過它。

  • 通過縮進,你字面意思是分頁佈局,還是這是你談論XML數據模型的樹結構的方式?

  • 當你說「之後」時,我們是否將這個(根據你的例子)解釋爲「第一後裔」元素,即我們在樹中行走時遇到的第一個匹配的後代?

我們可以假設這些「第一後代」總是從原始節點(即孫輩?)向下兩級。如果是這樣,XPath的解決方案就是

//s:key[@name="applications"]/*/*/@name 

但是,如果「第一後裔」可能是在不同的深度,然後就變得相當困難,而解決方案可能還取決於您所使用的XPath的版本。所以我們需要更多的信息。

我不知道xml_grep能夠做什麼。

+0

你已經非常廣泛地分解了我的問題。我只是修改了XML代碼片段以包含代碼的開始部分(爲了讓每個人都能看到完整的圖片)。回答@MichaelKay提出的問題:「縮進」是我描述代碼中每個標籤級別的笨拙方式。所以,如果''是「父」,那麼''將是「子」(下一級)。孩子的水平是我有興趣收集的;我不會再下去了。 –

相關問題