从查询.xml文件中获取结果

时间:2015-10-23 11:09:07

标签: xml

所以我有关于如何从.xml文件中获取一些结果的问题。 我们正在比较我们程序的2个版本,方法是生成一个xml文件,其中包含多个文件与结构的差异:

<Results>
   <ElemXDataList>
    <Item From="0" To="10" Elements="14511"> 
     <ElemXData>
      <Item>
       <Line>1</Line>
       <Col>0</Col>
       <Header>ID</Header>
       <Val1>0</Val1>
       <Val2>0</Val2>
       <Percent>0</Percent>
      </Item>
      <Item>
       ...
      </Item>
       ...
     </ElemXData>
     </Items>
    <Item From="10" To="20" Elements="1095">
     ...
    </Item>
    ...
   </ElemXDataList>
</Results>

第一个标签项目的差异从0到10与14511项目,第二个标签项目有1095个项目,差异在10到20之间。所以一个,限制可以在此期间修改,但你明白了。 这将是多个文件的最终.xml文件(将具有相同限制但具有不同数量的元素的项标记,具体取决于多少不同)或者可能是不同的.xml文件并从路径查询它们。 我想减轻测试人员的任务(他们没有编程的背景),所以他们有一个点开始在哪里看,并给他们3个字段的限制“从”和“到”和另一个与元素数量的限制。现在的结果将是真是假,将来我会返回更详细的总结。 任何人都可以告诉我如何实现这一点或者可能从一开始就有所帮助?我是一名具有C#经验的c ++程序员。 感谢您抽出时间阅读这篇长篇文章。

2 个答案:

答案 0 :(得分:0)

像这样尝试XML Linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<Results>" +
                  "<ElemXDataList>" +
                    "<Item From=\"0\" To=\"10\" Elements=\"14511\">" +
                      "<ElemXData>" +
                        "<Item>" +
                          "<Line>1</Line>" +
                          "<Col>0</Col>" +
                          "<Header>ID</Header>" +
                          "<Val1>0</Val1>" +
                          "<Val2>0</Val2>" +
                          "<Percent>0</Percent>" +
                        "</Item>" +
                        "<Item>" +
                        "</Item>" +
                      "</ElemXData>" +
                    "</Item>" +
                    "<Item From=\"10\" To=\"20\" Elements=\"1095\">" +
                    "</Item>" +
                  "</ElemXDataList>" +
                "</Results>";

            XElement results = XElement.Parse(xml);

            var elemXDataList = results.Descendants("ElemXDataList").FirstOrDefault().Elements("Item").Select(x => new
            {
                from = (int)x.Attribute("From"),
                to = (int)x.Attribute("To"),
                elements = (int)x.Attribute("Elements"),
                children = x.FirstNode
            }).ToList();

            var query = elemXDataList.Where(x => (x.from == 0) && (x.to == 10) && (x.elements == 14511)).FirstOrDefault();

        }
    }
}
​

答案 1 :(得分:0)

对于轻量级C ++实现/示例,请参见下文。 这是使用免费的opensource pugixml库,可以从http://pugixml.org/

下载
#include "pugixml.hpp"

#include <iostream>
#include <string>

int main()
{
    pugi::xml_document doc;
    if (!doc.load_file("/path/filename.xml")) return -1;

    pugi::xpath_query query_tool("//Item");
    pugi::xpath_node_set tools = query_tool.evaluate_node_set(doc);
    pugi::xpath_query query_From("@From");
    pugi::xpath_query query_To("@To");
    pugi::xpath_query query_Elements("@Elements");

    for (pugi::xml_node tool = tools.first().node(); tool; tool = tool.next_sibling())
    {
        std::string f = query_From.evaluate_string(tool);
        std::string t = query_To.evaluate_string(tool);
        std::string e = query_Elements.evaluate_string(tool);
        std::cout << f << ", " << t << ", " << e << std::endl;
    }

    std::cout << "done" << std::endl;

    return 0;
}