2

请原谅我的英语,我不是母语人士

我是新手,所以我不太了解

我正在尝试使用 xidel 在 windows cmd 中使用以下命令从 json 文件中提取一些值,但它不起作用

xidel MyFile.json -e '$json//options/option/*[@option_id="D-ES"]/content_id'

一般json文件有英文、西班牙文和葡萄牙文三个选项,我只想要和西班牙文相关的所有值

我想提取以下值

"group_id": "******",                                       
"content_id": "******",                                     
"current_content": "*****",                                     
"option_id": "D-ES",                                                                        
"subtitle": *****,                                                                              
"id": "ES",                                     
"desc": "Español",

并将提取的值如下

"group_id"-"*****","content_id"-"*****","current_content"-"*****","option_id"-"D-ES"-"subtitle"- *****,"id"- "ES""desc"- "Español",

这是我的 json 文件的一部分

{
  "original": {
    "id": "ING",
    "desc": "Inglés"
  },
  "dubbed": "true",
  "subbed": "false",
  "options": {
    "option": [
      {
        "group_id": "922450",
        "content_id": "284951",
        "current_content": "false",
        "option_id": "D-ES",
        "audio": "ES",
        "subtitle": null,
        "option_name": "dubbed",
        "id": "ES",
        "desc": "Español",
        "label_short": "Dob. Español",
        "label_large": "Doblada al Español",
        "intro_start_time": null,
        "intro_finish_time": null,
      },
      {
        "group_id": "275495",
        "content_id": "243856",
        "current_content": "false",
        "option_id": "D-PT",
        "audio": "PT",
        "subtitle": null,
        "option_name": "dubbed",
        "id": "PT",
        "desc": "Portugués",
        "label_short": "Dob. Portugués",
        "label_large": "Doblada al Portugués",
        "intro_start_time": null,
        "intro_finish_time": null,
      },
      {
        "group_id": "248954",
        "content_id": "245238",
        "current_content": "false",
        "option_id": "O-EN",
        "audio": "ORIGINAL",
        "subtitle": null,
        "option_name": "original",
        "id": "EN",
        "desc": "Inglés",
        "label_short": "Id. Inglés",
        "label_large": "Idioma Original Inglés",
        "intro_start_time": null,
        "intro_finish_time": null,
      }
    ]
  }
}

我应该使用什么命令来提取与西班牙语相关的值?

4

1 回答 1

1
xidel MyFile.json -e '$json//options/option/*[@option_id="D-ES"]/content_id'
  • 如果您使用的是 Windows 二进制文件,通常建议交换引号。这种引用风格适用于 Linux。
  • 要导航“选项”数组,请使用(option)()(或 XQuery 3.1 语法option?*)。
  • @仅当您的输入是 HTML/XML 时才需要。

所以正确的查询是-e "$json//options/(option)()[option_id='D-ES']/content_id".

我想提取以下值 [...]

xidel -s MyFile.json -e "$json//options/(option)()[option_id='D-ES']/(group_id,content_id,current_content,option_id,subtitle,id,desc)"
922450
284951
false
D-ES
ES
Español

要包括我会做的属性名称:

xidel -s MyFile.json -e "for $x in ('group_id','content_id','current_content','option_id','subtitle','id','desc') return $json//options/concat($x,' - ',(option)()[option_id='D-ES']($x))"
group_id - 922450
content_id - 284951
current_content - false
option_id - D-ES
subtitle
id - ES
desc - Español

如果你真的想要周围的双引号,你可以在 -function 中添加它们(用反斜杠转义)concat()...

-e ".../concat('\"',$x,'\"-\"',(option)()[option_id='D-ES']($x),'\"')"

...或者您可以使用xidel“扩展字符串”语法...

-e ".../x'\"{$x}\"-\"{(option)()[option_id='D-ES']($x)}\"'"

...或使用 XQuery 表示法作为双引号...

--xquery ".../x'"{$x}"-"{(option)()[option_id='D-ES']($x)}"'"

输出:

"group_id"-"922450"
"content_id"-"284951"
"current_content"-"false"
"option_id"-"D-ES"
"subtitle"-""
"id"-"ES"
"desc"-"Español"

最后将此序列转换为一行,其中每个项目由 a 分隔,

xidel -s MyFile.json -e "join(for $x in ('group_id','content_id','current_content','option_id','subtitle','id','desc') return $json//options/x'\"{$x}\"-\"{(option)()[option_id='D-ES']($x)}\"',',')"
"group_id"-"922450","content_id"-"284951","current_content"-"false","option_id"-"D-ES","subtitle"-"","id"-"ES","desc"-"Español"

最后的命令/查询美化:

-e "
  join(
    for $x in (
      'group_id','content_id','current_content',
      'option_id','subtitle','id','desc'
    ) return
    $json//options/x'\"{$x}\"-\"{(option)()[option_id='D-ES']($x)}\"',
    ','
  )
"
于 2021-05-27T00:06:33.013 回答