基于元素属性在命令行中拆分xml文件

时间:2015-12-30 19:25:53

标签: xml command-line

我有一个包含不同节点和属性的巨大xml文件。我使用#pragma comment(lib,"ws2_32.lib")来计算具有特定类型的产品。这是我到目前为止所做的:

gcc prog.c -o prog.exe [...other .c and .o files...] -lws2_32 ...

所以我需要在new.xml文件中将类型布料作为树提取所有产品而不包含所有其他属性,以便我可以将new.xml文件导入数据库:

grep -c

1 个答案:

答案 0 :(得分:0)

从显示grep的示例和应用于问题的命令行标记,看起来您需要一个纯命令行解决方案。一种选择是使用xmllint运行XPath查询,该查询仅选择类型为“cloths”的产品。

> xmllint --xpath /catalog/product[@type=\"cloths\"] products.xml
<product type="cloths" product_image="cardigan.jpg">
      <catalog_item gender="Men's">
         <item_number>QWZ5671</item_number>
         <price>39.95</price>
         <size description="Medium">
            <color_swatch image="red_cardigan.jpg">Red</color_swatch>
            <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
         </size>
         <size description="Large">
            <color_swatch image="red_cardigan.jpg">Red</color_swatch>
            <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
         </size>
      </catalog_item>
      <catalog_item gender="Women's">
         <item_number>RRX9856</item_number>
         <price>42.50</price>
         <size description="Small">
            <color_swatch image="red_cardigan.jpg">Red</color_swatch>
            <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
            <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
         </size>
         <size description="Medium">
            <color_swatch image="red_cardigan.jpg">Red</color_swatch>
            <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
            <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
            <color_swatch image="black_cardigan.jpg">Black</color_swatch>
         </size>
         <size description="Large">
            <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
            <color_swatch image="black_cardigan.jpg">Black</color_swatch>
         </size>
         <size description="Extra Large">
            <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
            <color_swatch image="black_cardigan.jpg">Black</color_swatch>
         </size>
      </catalog_item>
   </product>

但请注意,这不会生成格式良好的XML文档。它只是一个包含XPath查询选择内容的节点集。但是,您可以将其包装在一些额外的脚本中以生成完整的XML文档。

printf '<?xml version="1.0"?>\n' > cloths.xml
printf '<!DOCTYPE catalog SYSTEM "catalog.dtd">\n' >> cloths.xml
printf '<catalog>\n' >> cloths.xml
xmllint --xpath /catalog/product[@type=\"cloths\"] products.xml >> cloths.xml
printf '\n</catalog>\n' >> cloths.xml

我省略了这些命令之间的错误检查以简化代码示例。

您还提到输入XML文件很大。根据有多大,这种方法在内存消耗方面可能无法很好地扩展。如果这是一个问题,那么您可能需要采用更多的流式处理方法来解决问题,一次读取输入文档的一小部分并逐步处理。这可能超出命令行的范围并进入自定义编码。流式XML API的一个示例是Java中的StAX。这是tutorial