문제

이것은 간단한 질문처럼 보일 수 있습니다.

그러나 Linux에서 실행중인 내 응용 프로그램 중 하나에서 사용할 XML 파서를 찾고 있습니다.

나는 사용 중입니다 국외 거주자 XML 파일을 읽음으로써 내 XML 파일을 구문 분석했습니다. 그러나 출력은 입력과 동일합니다.

이것은 내가 읽고있는 내 파일입니다.

<?xml version="1.0" encoding="utf-8"?>
    <books>
         <book>
              <id>1</id>
              <name>Hello, world!</name>
         </book>
    </books>

그러나 이것을 통과 한 후에는 출력과 정확히 동일하게 얻습니다. 파서가 무엇인지 궁금해합니까?

한 가지 더. 나는 국외 거주자를 사용하고 있습니다. 사용하기가 매우 어려워 보입니다. 내 코드는 다음과 같습니다. 파일로 읽습니다. 그러나 내 응용 프로그램은 파일이 아닌 소켓으로 수신 될 버퍼를 구문 분석해야합니다. 누군가가 가진 샘플이 있습니까?

int parse_xml(char *buff)
{
    FILE *fp;
    fp = fopen("mybook.xml", "r");
    if(fp == NULL)
    {
        printf("Failed to open file\n");
        return 1;
    }

   /* Obtain the file size. */
    fseek (fp, 0, SEEK_END);
    size_t file_size = ftell(fp);
    rewind(fp);

    XML_Parser parser = XML_ParserCreate(NULL);
    int done;
    memset(buff, 0, sizeof(buff));

    do
    {
        size_t len = fread(buff, 1, file_size, fp);
        done = len < sizeof(buff);

        if(XML_Parse(parser, buff, len, done) == XML_STATUS_ERROR)
        {
            printf("%s at line %d\n", XML_ErrorString(XML_GetErrorCode(parser)),
                                      XML_GetCurrentLineNumber(parser));
            return 1;
        }
    }
    while(!done);

    fclose(fp);
    XML_ParserFree(parser);

    return 0;
}
도움이 되었습니까?

해결책

XML 구문 분석 주위에 머리를 감싸는 데 시간이 걸렸습니다 (C가 아닌 Perl에서 수행하지만). 기본적으로 콜백 함수를 등록합니다. 파서는 각 노드에 대한 콜백을 핑하고 모든 종류의 육즙이 많은 비트 (일반 텍스트, 모든 속성, 어린이 노드 등)를 포함하는 데이터 구조를 전달합니다. 당신은 어떤 종류의 상태 정보, 즉 물건을 연결하는 해시 트리와 같은 종류의 상태 정보 또는 모든 내장이 포함되어 있지만 XML이 포함되지 않는 문자열과 같은 종류의 상태 정보를 유지해야합니다.

XML은 선형이 아니며 긴 텍스트 덩어리처럼 구문 분석하는 것이 의미가 없습니다. 대신, 당신은 나무처럼 구문 분석합니다. 행운을 빕니다.

다른 팁

국외 거주자는 짝수 구문자입니다. 태그, 속성 등을 처리하려면 코드를 작성한 다음 소포에 코드를 등록해야합니다. 기사가 있습니다 여기 이 작업을 수행하는 방법을 설명합니다.

소켓에서 읽는 것과 관련하여 플랫폼에 따라 소켓을 파일 핸들처럼 취급 할 수 있습니다. 그렇지 않으면 소켓에서 자체 판독 값을 작성한 다음 데이터를 국외 거주자에게 명시 적으로 전달해야합니다. 이를 수행 할 API가 있습니다. 그러나 나는 먼저 일반 파일로 작동하도록 노력하고 있습니다.

국외 거주자 대신에 이미 배포에 포함 된 Libxml2를 살펴볼 수 있습니다. Dom (Tree Mode), SAX (스트리밍 모드), XPATH (XML IMHO와 복잡한 일을 할 수 없음) 등 모든 종류의 케이크를 제공합니다. 국외 거주자만큼 가볍지는 않지만 사용하기가 훨씬 쉽습니다.

글쎄, 당신은 가장 복잡한 XML 파서를 선택했습니다 (이벤트 중심 파서는 처리하기가 더 어렵습니다). 왜 국외 거주자 libxml?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top