如何创建数组缓冲区来保存一系列字符串向量

时间:2014-09-15 17:52:29

标签: c++ xml vector mixed-mode

这是我的对象类向量构建为类doinfo,函数printtoxml继承自类doinfo,

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
#include <fstream>

#include <sstream>
#include <algorithm>

#include <msclr/marshal_cppstd.h>

#using <System.dll>
#using <System.Xml.dll>
#using <System.Data.dll>

void queryinxpath_();

class doinfo
{
public:
    doinfo(const std::string &dono,const std::string &acno, \
        const std::string &name,const std::string &stcd, \
        const std::string &desc,const std::string &upri, \
        const std::string &dqty,const std::string &namb)
        :dono_(dono),acno_(acno),name_(name),stcd_(stcd), \
        desc_(desc),upri_(upri),dqty_(dqty),namb_(namb)
    {}

    void printoxml();

    const std::string dono_;
    const std::string acno_;
    const std::string name_;
    const std::string stcd_;
    const std::string desc_;
    const std::string upri_;
    const std::string dqty_;
    const std::string namb_;

private:

};

void doinfo::printoxml()
{

    std::ofstream fo;

    fo.open("C:\\test-result.xml",std::ios::out);

     fo << "<Do>\n";

        fo << "\t<delivery>\n";
        fo << "\t\t<dono>" << dono_ << "</dono>\n";
        fo << "\t\t<custcode>" << acno_ << "</custcode>\n";
        fo << "\t\t<custname>" << name_ << "</custname>\n";
        fo << "\t\t<stockcode>" << stcd_ << "</stockcode>\n";
        fo << "\t\t<stockdesc>" << desc_ << "</stockdesc>\n";
        fo << "\t\t<unitprice>" << upri_ << "</unitprice>\n";
        fo << "\t\t<qty>" << dqty_ << "</qty>\n";
        fo << "\t\t<amount>" << namb_ << "</amount>\n";
        fo << "\t</delivery>\n";

     fo << "</Do>\n";

     fo.close();

}

void queryinxpath_()
{

    std::string dono;
    std::string custcode;
    std::string custname;
    std::string stockcode;
    std::string stockdesc;
    std::string unitprice;
    std::string qty;
    std::string amount;


    System::Xml::XPath::XPathDocument^ doc = gcnew System::Xml::XPath::XPathDocument("C:/test.xml");

    System::Xml::XPath::XPathNavigator^ nav = doc->CreateNavigator();

    System::Xml::XPath::XPathExpression^ expr = nav->Compile("descendant::delivery[amount > 100]");

    System::Xml::XPath::XPathNodeIterator^ iterator=nav->Select(expr);

    std::vector<doinfo> don;

    while (iterator->MoveNext())
    {

        System::Xml::XPath::XPathNavigator^ nav_ = iterator->Current->Clone();

        nav_->MoveToChild("dono","");
        //msclr::interop::marshal_context context;
        //dono = context.marshal_as<std::string>(nav_->Value);
        dono = msclr::interop::marshal_as<std::string>(nav_->Value);

        System::Console::WriteLine("Dono : {0}",msclr::interop::marshal_as<System::String^>(dono));

        nav_->MoveToParent();
        nav_->MoveToChild("custcode","");

        custcode = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("Customer Code : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("custname","");

        custname = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("Customer Name : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("stockcode","");

        stockcode = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("StockCode : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("stockdesc","");

        stockdesc = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("Stockdesc : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("unitprice","");

        unitprice = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("UnitPrice : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("qty","");

        qty = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("Quantity : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("amount","");

        amount = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("Amount : {0} ",nav_->Value);

        System::Console::WriteLine("\n");

        don.push_back(doinfo(dono,custcode,custname,stockcode,stockdesc,unitprice,qty,amount));

    }

    std::vector<doinfo>::iterator ite;

    for (ite=don.begin();ite!=don.end();++ite)
    {

        ite->printoxml();

    }

}

int _tmain(int argc, _TCHAR* argv[])
{
    queryinxpath_();

    return 0;


}

当我返回检查&#34; test-result.xml&#34;的结果时,它将显示它只有一堆交付节点存在。它假设存在很少的交付节点,但它只能捕获循环结束过程中的最后一个节点。

<Do>
    <delivery>
        <dono>DM202423</dono>
        <custcode>M15</custcode>
        <custname>A Company</custname>
        <stockcode>ZPPFERG</stockcode>
        <stockdesc>PRECISCO ENVELOPE</stockdesc>
        <unitprice>0.8200</unitprice>
        <qty>200</qty>
        <amount>164.00</amount>
    </delivery>
</Do>

任何人都可以通过在内部类doinfo中创建一个数组缓冲区来帮助我解决我的问题,这样我就可以捕获内存中的每个字符串对象,以便进一步打印到xml文件中。

1 个答案:

答案 0 :(得分:0)

我通过将ofstream作为参数传递给向量对象类的成员函数来解决我的问题。这是我的完整代码。

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
#include <fstream>

#include <sstream>
#include <algorithm>

#include <msclr/marshal_cppstd.h>

#using <System.dll>
#using <System.Xml.dll>
#using <System.Data.dll>

void queryinxpath_();

class doinfo
{
public:
    doinfo(const std::string &dono,const std::string &acno, \
        const std::string &name,const std::string &stcd, \
        const std::string &desc,const std::string &upri, \
        const std::string &dqty,const std::string &namb)
        :dono_(dono),acno_(acno),name_(name),stcd_(stcd), \
        desc_(desc),upri_(upri),dqty_(dqty),namb_(namb)
    {}

    void printoxml(std::ofstream &os);

    const std::string dono_;
    const std::string acno_;
    const std::string name_;
    const std::string stcd_;
    const std::string desc_;
    const std::string upri_;
    const std::string dqty_;
    const std::string namb_;

private:

};

void doinfo::printoxml(std::ofstream &os)
{

        os << "\t<delivery>\n";
        os << "\t\t<dono>" << dono_ << "</dono>\n";
        os << "\t\t<custcode>" << acno_ << "</custcode>\n";
        os << "\t\t<custname>" << name_ << "</custname>\n";
        os << "\t\t<stockcode>" << stcd_ << "</stockcode>\n";
        os << "\t\t<stockdesc>" << desc_ << "</stockdesc>\n";
        os << "\t\t<unitprice>" << upri_ << "</unitprice>\n";
        os << "\t\t<qty>" << dqty_ << "</qty>\n";
        os << "\t\t<amount>" << namb_ << "</amount>\n";
        os << "\t</delivery>\n";

}

void queryinxpath_()
{

    std::string dono;
    std::string custcode;
    std::string custname;
    std::string stockcode;
    std::string stockdesc;
    std::string unitprice;
    std::string qty;
    std::string amount;


    System::Xml::XPath::XPathDocument^ doc = gcnew System::Xml::XPath::XPathDocument("C:/test.xml");

    System::Xml::XPath::XPathNavigator^ nav = doc->CreateNavigator();

    System::Xml::XPath::XPathExpression^ expr = nav->Compile("descendant::delivery[amount > 100]");

    System::Xml::XPath::XPathNodeIterator^ iterator=nav->Select(expr);

    std::vector<doinfo> don;

    while (iterator->MoveNext())
    {

        System::Xml::XPath::XPathNavigator^ nav_ = iterator->Current->Clone();

        nav_->MoveToChild("dono","");
        //msclr::interop::marshal_context context;
        //dono = context.marshal_as<std::string>(nav_->Value);
        dono = msclr::interop::marshal_as<std::string>(nav_->Value);

        System::Console::WriteLine("Dono : {0}",msclr::interop::marshal_as<System::String^>(dono));

        nav_->MoveToParent();
        nav_->MoveToChild("custcode","");

        custcode = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("Customer Code : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("custname","");

        custname = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("Customer Name : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("stockcode","");

        stockcode = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("StockCode : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("stockdesc","");

        stockdesc = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("Stockdesc : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("unitprice","");

        unitprice = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("UnitPrice : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("qty","");

        qty = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("Quantity : {0} ",nav_->Value);

        nav_->MoveToParent();
        nav_->MoveToChild("amount","");

        amount = msclr::interop::marshal_as<std::string>(nav_->Value);
        System::Console::WriteLine("Amount : {0} ",nav_->Value);

        System::Console::WriteLine("\n");

        don.push_back(doinfo(dono,custcode,custname,stockcode,stockdesc,unitprice,qty,amount));

    }

    std::ofstream fo;

    fo.open("c:\\test-result.xml",std::ios::out);

    std::vector<doinfo>::iterator ite;

     fo << "<Do>\n";

    for (ite=don.begin();ite!=don.end();++ite)
    {

        ite->printoxml(fo);

    }


     fo << "</Do>\n";

     fo.close();

}

int _tmain(int argc, _TCHAR* argv[])
{
    queryinxpath_();

    return 0;


}