程式狂想筆記

一個攻城師奮鬥史

0%

XML 好用的查詢工具

最近做 Digital Data Exchange 介接資料
XML 平常是會用,有知道一些 Library 可以解析裡面資料
但進階的 xpath 平常沒有什麼用到
就找找看有什麼實用工具
讓未來 debug 有更快的方法

首先 Digital Data Exchange 是一個規則(XML)
因為可能會用到 xpath 在想有什麼好工具可以用?

XSD

首先,先講解什麼是 XSD(XML Schema D)
我以前這篇文章有提過驗證快速檢查JSON方法 | 程式狂想筆記

使用 XSD 為 XML 客製 Intellisense 輸入選單 - Yowko’s Notes
XSDVi
Dgis XSD Diagram

但我還沒找到好用的工具

bash 指令

xmllint

1
2
3
4
# 安裝
sudo apt install libxml2-utils
# 使用 xpath
xmllint --xpath "//*[local-name()='product_version']/*[local-name()='name']/text()" file.xml

不過不知到為什麼公司有裝的工具不能用
可能版本太舊?

2019-09-10
有找到方法
xmllint unknown option ‘–xpath’ - Stack Overflow

結果查東西還是要用人工去掃…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
xmllint --shell xxxx.xml << EOF
'//xxx'
EOF



xmllint --shell xxxx.xml <<<'xpath //xxx'


for f in `find . -type f -name '*.xml'`
do
xmllint --shell $f <<<'xpath //oooo/'
done


for f in `find . -type f -name '*.xml'`
do
echo $f
xmllint --shell $f <<<'xpath //oooo[.!="aa" and .!="bbb" and .!="ccc"]/text()'
done

for f in *.xml
do
echo $f
done

for f in `find . -type f -name '*.xml'`
do
echo $f
xmllint --shell $f <<<'xpath //xxx[.="123456"]/text()'
done

xpath

1
2
3
4
# 安裝
sudo apt install libxml-xpath-perl
# xpath
xpath -e '//book/name/text()' sample.xml

xml2

1
2
3
# 安裝
sudo apt install xml2
cat sample.xml |xml2

詳細可看: Shell解析处理XML方法汇总 備份圖

其他參考

實用 vscode 套件

XML - Visual Studio Marketplace
記得要安裝 Java
要設定 home 路徑
XML Tools - Visual Studio Marketplace
可查 xpath ,算是滿方便可以查詢套件!!

相關 xpath 一些教學網站

因為還沒有很熟悉,之後開一篇做 xpath 筆記
XSD 可能也會記錄怎麼看,感覺認真看 XML 也是個大坑!!!

2019-10-02

xpath 可以寫這麼複雜
但要記得[]比對資料要帶"

1
DataReference[text()=//ShowArtist[@SequenceNumber="1"]/ArtistDataReference]

XPath online real-time tester, evaluator and generator for XML & HTML
爬虫进阶开发——xpath选择器常见用法 · phpspider开发文档
在 xml.value 中, XPath中使用 text() 函数的重要性 | 陈鹏个人博客

relative path ./
/
//xxxx[xxxx[xxxx=sss]]=//xxxx[xxxx]/

domxpath

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$xpath = new \DOMXpath($this->xml); // 這邊 xml 是放 DOMDocument
$query="xxxx/oooo[1]/vvvvv/ddd"; // relative ??
// 目前看到官網也有類似相關範例
// 我的認知 Xpath 前面都要有 // or /
// 這邊應該都是從 root 開始


$node = $xpath->query($query)->item(0);
$node = !empty($node) ? trim($node->nodeValue) : '' ;

foreach ($dates as $key => $a_node) {
foreach ($a_node->childNodes as $value) {
if ($value->nodeName == 'xxxx') {

...

這邊注意 SimpleXML 跟 domxpath 完全沒什麼關係
我目前看法這些應該是兩個不同 Library
所以用法也不太一樣
domxpath 回傳東西很像 Javascript 的 Node
記得 domxpath 抓

看起來很不錯套件servo-php/fluidxml: FluidXML, the PHP library for manipulating XML with a concise and fluent API.