在C中保存一行中多次出现的strstr()



这是我第一次在这里发帖,如果格式有点错误,我很抱歉。

基本上,我的工作要求我通读XML(带有无效标记,因此使用库可能是不可能的-我无法控制XML文件),从标记中获取特定的字符串,并将其输出到CSV。

到目前为止,我已经能够解析程序的一部分,但是当所需的标记在一行中多次出现时,我遇到了问题。

这是XML的一般格式:

<my:LineItem>
            <my:LineNumber>1</my:LineNumber>
            <my:PartNumber></my:PartNumber>
            <my:Quantity>1</my:Quantity>
            <my:UOM>EA</my:UOM>
            <my:UnitCost>1</my:UnitCost>
            <my:ExtendedCost>1</my:ExtendedCost>
            <my:CostCentre>801090 - CG Collab - Feretti -Core 1</my:CostCentre>
            <my:ExpenseCode>86130 - Lab Equipment Rental</my:ExpenseCode>
            <my:CostExpenseMerge>801090.86130</my:CostExpenseMerge>
            <my:Description>123</my:Description>
            <my:Comments>1</my:Comments>
        </my:LineItem><my:LineItem><my:LineNumber>2</my:LineNumber><my:PartNumber></my:PartNumber><my:Quantity>2</my:Quantity><my:UOM>BX</my:UOM><my:UnitCost>2</my:UnitCost><my:ExtendedCost xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">4</my:ExtendedCost><my:CostCentre>800186 University of Maastricht - Bou</my:CostCentre><my:ExpenseCode>86110 - Glass/Plastic Washing S</my:ExpenseCode><my:CostExpenseMerge>800186.86110</my:CostExpenseMerge><my:Description></my:Description><my:Comments>2</my:Comments></my:LineItem><my:LineItem><my:LineNumber>3</my:LineNumber><my:PartNumber></my:PartNumber><my:Quantity>3</my:Quantity><my:UOM>CA</my:UOM><my:UnitCost>3</my:UnitCost><my:ExtendedCost xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">9</my:ExtendedCost><my:CostCentre>800180 J Bartlett PCC – PRONTO Team Grant</my:CostCentre><my:ExpenseCode>81920 - Mechanical Supplies</my:ExpenseCode><my:CostExpenseMerge>800180.81920</my:CostExpenseMerge><my:Description></my:Description><my:Comments>3</my:Comments></my:LineItem>

我只需要保存特定的值,如Quantity, CostExpenseMerge和Description。

;到目前为止,我能够读出的前两次出现,因为它们出现在不同的行上。我现在的问题是:如何在一行中保存多次出现的所需标记?

XML似乎随机地将多个条目强制放入一行(参见输入文件中的第2项和第3项)。

这是我的阅读:

char buffer[1024];
    const char * startTag = "<my:Quantity>";
    const char * endTag = "</my:Quantity>";
    char * start, * end;
    char * tempString, * target=NULL;
while(fgets(buffer, sizeof(buffer), entry_file)){
        if((start=strstr(buffer,startTag))){
                start+=strlen(startTag);
                if((end=strstr(start,endTag))){
                    target = (char*)malloc(end-start+1);
                    memcpy(target, start, end-start);
                    target[end-start]='';
                    if(target)printf("%sn", target);   
                }
        }
        }

我的输出是:

1
2

这意味着第三次出现没有被读取(它应该是"3")。

请帮助!

必须在循环中处理标签,因为一行中可能有多个标签:

while(fgets(buffer, sizeof(buffer), entry_file)){
        start= buffer;
        while ((start=strstr(start,startTag))){
                start+=strlen(startTag);
                if((end=strstr(start,endTag))){
                    target = (char*)malloc(end-start+1);
                    memcpy(target, start, end-start);
                    target[end-start]='';
                    if(target)printf("%sn", target);   
                    start= end+strlen(endtag);
                }
                else break;
        }
}

使用while()而不是if()。下面是一个用于数据的测试程序:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char buffer[1024];
const char * startTag = "<my:Quantity>";
const char * endTag = "</my:Quantity>";
char * start, * end;
char * tempString, * target=NULL;
int line_offset = 0;
int main( int argc, char* argv[] )
{
    FILE* xml = fopen( "data.xml", "r" );
    if( xml == NULL )
    {
        fprintf( stderr, "Could not load data.xmln" );
        exit( EXIT_FAILURE );
    }
    while(fgets(buffer, sizeof(buffer), xml)){
        line_offset = 0;
        while((start=strstr(&buffer[line_offset],startTag))){
                start+=strlen(startTag);
                if((end=strstr(start,endTag))){
                    target = (char*)malloc(end-start+1);
                    memcpy(target, start, end-start);
                    target[end-start]='';
                    if(target)printf("%sn", target);
                }
            line_offset += start - buffer;
        }
    }
}

最新更新