我有一个包含不同节点和属性的巨大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
答案 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。