gpt4 book ai didi

用于在 xml 中查找键/值的正则表达式

转载 作者:行者123 更新时间:2023-12-05 03:28:52 26 4
gpt4 key购买 nike

我的正则表达式适用于拾取字符串内容的各个区域,但是当我将它放入代码中以获取键值对映射时,映射是错误的。有什么想法吗?

重复的内容如下所示,alarmID 的右侧不同,如 12-5000,Key Name 如 LOAD_MEDIA:

<?xml version="1.0" encoding="utf-16"?>
<Configuration>
<Key Name="Alarms">
<Key Name="LOAD_MEDIA">
<Value Name="AlarmID">12-5000</Value>
<Value Name="blah">Dialog.Cut</Value>
<Value Name="blah1"></Value>
<Value Name="blah2">Dialog.Cancel</Value>
<Value Name="blah3">false</Value>
<Value Name="blah4">true</Value>
<Key Name="Sizes">
<Key Name="57x">
<Value Name="blah1">7</Value>
<Value Name="blah2">9</Value>
<Value Name="blah3">Dialog.57</Value>
</Key>
<Key Name="88">
<Value Name="blah1">10</Value>
<Value Name="blah2">10</Value>
<Value Name="blah3">Dialog.88</Value>
</Key>
<Key Name="810">
<Value Name="blah1">10</Value>
<Value Name="blah2">12</Value>
<Value Name="blah3">Dialog.810</Value>
</Key>
<Key Name="114">
<Value Name="blah1">1</Value>
<Value Name="blah2">1</Value>
<Value Name="blah3">Dialog.114</Value>
</Key>
<Key Name="10">
<Value Name="blah1">1</Value>
<Value Name="blah2">2</Value>
<Value Name="blah3">Dialog.10</Value>
</Key>
</Key>
</Key>
<Key Name="LOAD_MEDIA2">
<Value Name="AlarmID">12-5001</Value>
<Value Name="blah">Dialog.Cut</Value>
<Value Name="blah1"></Value>
<Value Name="blah2">Dialog.Cancel</Value>
<Value Name="blah3">false</Value>
<Value Name="blah4">true</Value>
<Key Name="Sizes">
<Key Name="57x">
<Value Name="blah1">7</Value>
<Value Name="blah2">9</Value>
<Value Name="blah3">Dialog.57</Value>
</Key>
<Key Name="88">
<Value Name="blah1">10</Value>
<Value Name="blah2">10</Value>
<Value Name="blah3">Dialog.88</Value>
</Key>
<Key Name="810">
<Value Name="blah1">10</Value>
<Value Name="blah2">12</Value>
<Value Name="blah3">Dialog.810</Value>
</Key>
<Key Name="114">
<Value Name="blah1">1</Value>
<Value Name="blah2">1</Value>
<Value Name="blah3">Dialog.114</Value>
</Key>
<Key Name="10">
<Value Name="blah1">1</Value>
<Value Name="blah2">2</Value>
<Value Name="blah3">Dialog.10</Value>
</Key>
</Key>
</Key>
</Key>
</Configuration>

..重复格式

出于某种原因,我返回的 errorMap 甚至都不是正确的。

这是应该在 $errorMap 中返回键值对的代码:

function Get-AlarmIDs{
[cmdletbinding()]
Param ([string]$fileContent)

# create an ordered hashtable to store the results
$errorMap = [ordered]@{}
# process the lines one-by-one
switch -Regex ($fileContent -split '\r?\n') {
'[\t]+?<Key Name="(.*)">[\r?\n\s]+?<Value' { #match Key Name followed by Value
if(-not($matches[1] -match '[0-9]')) #use if it's not something like 57
{
$key = ($matches[1]).Trim()
}
}
'AlarmID">(.*)<' { #match AlarmID like 12-5700
$errorMap[$key] = ($matches[1]).Trim()
}
}

return $errorMap
}

我希望 map 看起来像这样:

LOAD_MEDIA, 12-5000
LOAD_MEDIA2, 12-3
...

我知道我在 regex101.com 上的测试显示我的键和值分别选择了所需的行,但是当我在代码中将它们放在一起时,映射全乱了:

[有序字典:1]

[0]: [6,"12-5900"]   

我不确定它从哪里得到 6,而 12-5900 大约是重复序列中的最后一个,应该在 12-5900 之前返回 5。

我使用的是 powershell 5.1 和 Visual Studio 代码。

更新:

我正在尝试以 xml 方式执行此操作,但不确定如何从 xml 中获取我需要的内容。

[xml]$xmlElm = (select-xml -xpath / -path $fileNamePath).node #Get-Content $fileNamePath 
$xmlElem.Configuration.'Key Name'.'Key Name'.Value #this doesn't print anything...shouldn't it?

更新2:

尝试更多...

[xml]$xmldocument = Get-Content $fileNamePath
$tmp1 = $xmldocument.ChildNodes.selectNodes("*")
$tmp2 = $xmldocument.ChildNodes.selectNodes("*/Key")
$tmp3 = $xmldocument.Key.Value.AlarmID[0] #this is indexing into null
$tmp4 = $xmldocument.Key.Value #this is null

更新3:

我正在尝试 Santiago 的答案中的内容,但在 map 中得到空白值。

[xml]$xmldocument = Get-Content $fileNamePath

$result = foreach($key in $xmldocument.Configuration.Key.Key)
{
[pscustomobject]@{
Key = $key.Name
Value = $key.Value.Where{$_Name -eq 'AlarmID'}.'#text'
}
}

给出(空值)

[0]: @{Key=LOAD_MEDIA; Value=}
[1]: @{Key=Load_MEDIA2; Value=}

我不确定有什么不同。

更新4:

$result = foreach($key in $xmldocument.Configuration.Key.Key)
{
[pscustomobject]@{
Key = $key.Name
Value = $key.Value
}
}
return $result

当我查看 $result 时,它看起来像这样:

[0]: @{Key=LOAD_MEDIA; Value=System.Object[]}
[1]: @{Key=Load_MEDIA2; Value=System.Object[]}

最佳答案

可能有比这更好的方法,但就目前而言,这应该可以帮助您获得所需的内容。假设您已经将 XML 加载到变量中,在本例中为 $xml:

$result = foreach($key in $xml.Configuration.Key.Key) {
[pscustomobject]@{
Key = $key.Name
Value = $key.Value.Where{$_.Name -eq 'AlarmID'}.'#text'
}
}

$result 使用有问题的 XML 应该如下所示:

Key         Value
--- -----
LOAD_MEDIA 12-5000
LOAD_MEDIA2 12-5001

关于用于在 xml 中查找键/值的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71164647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com