Xmlstarlet命令从终端到Windows Powershell

时间:2017-10-03 14:25:52

标签: xml windows powershell cmd xmlstarlet

在我的终端(linux / mac)上我用这个:

@Test
fun verifyNamesOfAddedItems () {

val getAllElementsNames = arrayOf(materials.text, element2.text, 
element3.text...) 
val correctElementsNames = arrayOf("name1", "name2", "name3"...)
val areArraysEqual = getAllElementsNames contentEquals correctElementsNames
if (!areArraysEqual) {
    assert(false)
} else {
    assert(true)
}

}

在Windows(powershell)上,我真的不知道如何修复此命令。我知道我需要使用$而不是@(因为powershell说使用$而不是@),但是包含有问题:

xmlstarlet ed -N ns=http://www.w3.org/2006/04/ttaf1 -d //ns:div[not(contains(@xml:lang,'Italian'))] "C:\Users\1H144708H\Downloads\a.mul.ttml" > "C:\Users\1H144708H\Downloads\a.mul.ttml.conv"

我甚至试过这个:

./xml.exe ed -N ns=http://www.w3.org/2006/04/ttaf1 -d //ns:div[not(contains($xml:lang,'Italian'))] "C:\Users\1H144708H\Downloads\a.mul.ttml" > "C:\Users\1H144708H\Downloads\a.mul.ttml.conv"

但我得到了#34;未能加载外部实体"错误""

1 个答案:

答案 0 :(得分:2)

System.Management.Automation是一个XPath表达式,其中包含一些特殊于各种shell的字符,因此您应该用引号保护它。使用双引号可以在bash,Powershell和cmd.exe中使用:

//ns:div[not(contains(@xml:lang,'Italian'))]

使用bash或Powershell时,最好使用单引号;对于那些shell,这需要防止xmlstarlet ed -N ns=http://www.w3.org/2006/04/ttaf1 -d "//ns:div[not(contains(@xml:lang,'Italian'))]" "C:\Users\1H144708H\Downloads\a.mul.ttml" > "C:\Users\1H144708H\Downloads\a.mul.ttml.conv" 的扩展(尽管在XPath中使用它是相当先进的):

$

请注意,内部引号也需要交换。