如何使用shell脚本读取XML并写入文本文件?

如何使用shell脚本读取XML并写入文本文件?,xml,bash,shell,Xml,Bash,Shell,如何在Shell脚本中读取XML标记及其值? 我搜索发现只有当我们知道标签名时才有可能 但是,我需要一个脚本,它读取XML中的所有标记(重复标记),其中包含值。 在我的XML中,标记可能会更改。所以,我想要一个可以用于不同XML的脚本 <Data> <Employees> <Employee location = "Paris"> <Name> Andy </Name>

如何在Shell脚本中读取XML标记及其值? 我搜索发现只有当我们知道标签名时才有可能

但是,我需要一个脚本,它读取XML中的所有标记(重复标记),其中包含值。 在我的XML中,标记可能会更改。所以,我想要一个可以用于不同XML的脚本

<Data>
    <Employees>

        <Employee location = "Paris">
            <Name> Andy </Name>
            <ID> 101 </ID>
        </Employee>

        <Employee location = "Germany">
            <Name> Batman </Name>
            <ID> 202 </ID>
        </Employee>

    </Employees>
</Data>

尝试以下内容,并让我知道这是否有助于你

awk '
/<\/Data>/{
  a="";
  next
}
/<Data>/{
  a=1;
  next
}
/location/ && a{
  gsub(/\"|>/,"",$NF);
  location=$NF;
  next
}
/Name/ && a{
  name=$2;
  next
}
/ID/ && a{
  print "Name : ",name RS "ID: ",$2 RS "Location: ",location;
  next
}
'    Input_file
awk'
//{
a=“”;
下一个
}
//{
a=1;
下一个
}
/位置/&a{
gsub(/\“\”>/,“,$NF);
地点=$NF;
下一个
}
/名称/&a{
姓名=$2;
下一个
}
/ID/&a{
打印“姓名:”,姓名RS“ID:”,$2 RS“位置:”,位置;
下一个
}
'输入文件
根据OP的要求,不应该硬编码任何标签,所以现在也添加以下解决方案

EDIT2:我不是xml专家,但在这里尝试过,请您检查一下

awk 'NF==1 && (/ +<[a-zA-Z]+>/ || /^<[a-zA-Z]+>/ || / +<\/[a-zA-Z]+>/){
next
}
{
sub(/^ +/,"")
gsub(/\"|<|>/,"",$0);
sub(/\/.*/,"");
if($0){
  print
}
}
'  Input_file
awk'NF==1&&(/+/| |/^/|/+/){
下一个
}
{
子(/^+/,“”)
gsub(/\“/,”,$0);
子(/\/.*/,“”);
如果有的话(0美元){
打印
}
}
'输入文件

awk-F[\>\正如我在评论中所说的,shell不适用于除最琐碎的XML文件以外的所有XML文件。不过,以下Python脚本将处理您抛出的任何格式良好的XML:

import xml.parsers.expat
import sys

def start_element(name, attrs):
    print('Start element:', name)
    for attribute_name, attribute_value in attrs.items():
        print('Attribute:', attribute_name, attribute_value)

def end_element(name):
    print('End element:', name)

def char_data(data):
    data = str(data).strip()
    if data:
        print('Character data:', data)

p = xml.parsers.expat.ParserCreate()

p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data

with open(sys.argv[1], 'rb') as xmlfile:
    p.ParseFile(xmlfile)
它几乎是逐字复制自。您可以操作三个函数
start\u元素
end\u元素
char\u数据
,以满足您的需要。(也就是说,到目前为止,它们不会产生您指定的确切输出,但可以稍加调整即可。)

可以这样称呼:

python3 script_above.py your_xml_file.xml

这不是shell脚本的工作。您应该使用适当的XML处理器,例如XSLT样式表。XML文件不能保证使用特定的空白格式或文本编码(这并不是说,您不能使用Bash在已知的XML文件上执行特定的小任务,但肯定不能在未知的XML文件上执行任意任务)感谢您的回复Boldewyn。我想知道是否有类似xmllint或其他可用的解析器?如果是,我希望脚本读取所有带值的标记。感谢您的回答RavinderSingh。但是,实际上我不知道标记名。有没有办法在不提供硬编码标记名的情况下读取所有标记?甚至没有ID,您将拥有的名称?No、 我的XML包含1000个标记。因此我无法给出所有的标记名。@CharanTej:你能现在查看我的EDIT2并告诉我吗?宾果,很高兴它帮助了你。享受学习和分享知识:)太好了!处理XML的聪明方法。谢谢
import xml.parsers.expat
import sys

def start_element(name, attrs):
    print('Start element:', name)
    for attribute_name, attribute_value in attrs.items():
        print('Attribute:', attribute_name, attribute_value)

def end_element(name):
    print('End element:', name)

def char_data(data):
    data = str(data).strip()
    if data:
        print('Character data:', data)

p = xml.parsers.expat.ParserCreate()

p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data

with open(sys.argv[1], 'rb') as xmlfile:
    p.ParseFile(xmlfile)
python3 script_above.py your_xml_file.xml