Чтение Xml Использование T- SQL - PullRequest
0 голосов
/ 05 февраля 2020

Я столкнулся с проблемой. Я пытаюсь разобрать указанный c XML документ. Документ начинается с тега, и внутри этих тегов может быть несколько кандидатов (в моем примере я предоставил 2 из них, но может быть любое количество предоставленных кандидатов.

Также у заявителя может быть несколько теги сохранены, опыт работы и т. д.

Проблема, с которой я сталкиваюсь, не может разобрать XML правильно, я получаю много повторяющихся строк и не могу понять, что проблема в

Я пытаюсь проанализировать данные с помощью CrossApply, и я знаю, что различение значений не является правильным способом.

Может кто-нибудь, пожалуйста, дайте мне знать, как я могу правильно проанализировать данные xml, если я не знаю, сколько претендентов содержится в файле XML?

IF OBJECT_ID('tempdb..#XmlApplicant') IS NOT NULL DROP TABLE #XmlApplicant
SELECT T.c.value('applicant_id[1]', 'varchar(500)') AS 'applicant_id'
    ,T.c.value('cv_id[1]', 'varchar(500)') AS 'cv_id'
    ,T.c.value('time[1]', 'varchar(500)') AS 'time'
    ,T.c.value('cover_letter[1]', 'varchar(max)') AS 'cover_letter'
    ,T.c.value('questions_answers[1]/question_1[1]', 'varchar(500)') AS 'question_1'
    ,T.c.value('questions_answers[1]/question_2[1]', 'varchar(500)') AS 'question_2'
    ,T.c.value('questions_answers[1]/question_3[1]', 'varchar(500)') AS 'question_3'
    ,T.c.value('questions_answers[1]/answer_1[1]', 'varchar(500)') AS 'answer_1'
    ,T.c.value('questions_answers[1]/answer_1[1]', 'varchar(500)') AS 'answer_2'
    ,T.c.value('questions_answers[1]/answer_1[1]', 'varchar(500)') AS 'answer_3'
    ,T.c.value('application_url[1]', 'varchar(500)') AS 'application_url'
    ,T.c.value('personal[1]/name[1]', 'varchar(500)') AS 'name'
    ,T.c.value('personal[1]/gender[1]', 'varchar(500)') AS 'gender'
    ,T.c.value('personal[1]/birth_date[1]', 'varchar(500)') AS 'birth_date'
    ,T.c.value('personal[1]/city[1]', 'varchar(500)') AS 'city'
    ,T.c.value('personal[1]/phone[1]', 'varchar(500)') AS 'phone'
    ,T.c.value('personal[1]/mail[1]', 'varchar(500)') AS 'mail'
    ,T.c.value('personal[1]/description[1]', 'varchar(500)') AS 'description'
    ,T.c.value('personal[1]/desired_salary[1]', 'varchar(500)') AS 'desired_salary'
    ,T.c.value('personal[1]/updated_date[1]', 'varchar(500)') AS 'updated_date'
    ,SUBSTRING(T.c.value('personal[1]/name[1]', 'varchar(500)'), 1, CHARINDEX(' ', T.c.value('personal[1]/name[1]', 'varchar(500)')) - 1) AS Vardas
    ,REVERSE(SUBSTRING(REVERSE(T.c.value('personal[1]/name[1]', 'varchar(500)')), 1, CHARINDEX(' ', REVERSE(T.c.value('personal[1]/name[1]', 'varchar(500)'))) - 1)) AS Pavarde
INTO #XmlApplicant
FROM #xmlDataParse
CROSS APPLY #xmlDataParse._xml.nodes('/response/applicant') T(c)
ORDER BY applicant_id ASC




IF OBJECT_ID('tempdb..#XmlEducation') IS NOT NULL DROP TABLE #XmlEducation
SELECT DISTINCT T.c.value('applicant_id[1]', 'varchar(500)') AS 'applicant_id'
    ,T.c.value('cv_id[1]', 'varchar(500)') AS 'cv_id'
    ,Education.c.value('date_from[1]', 'varchar(500)') AS 'date_from'
    ,Education.c.value('date_till[1]', 'varchar(500)') AS 'date_till'
    ,Education.c.value('institution[1]', 'varchar(500)') AS 'institution'
    ,Education.c.value('speciality[1]', 'varchar(500)') AS 'speciality'
    ,Education.c.value('degree[1]', 'varchar(500)') AS 'degree'
INTO #XmlEducation
FROM #xmlDataParse
CROSS APPLY #xmlDataParse._xml.nodes('/response/applicant') T(c)
CROSS APPLY #xmlDataParse._xml.nodes('/response/applicant/education') Education(c)


IF OBJECT_ID('tempdb..#XmlCourses') IS NOT NULL DROP TABLE #XmlCourses
SELECT DISTINCT T.c.value('applicant_id[1]', 'varchar(500)') AS 'applicant_id'
    ,T.c.value('cv_id[1]', 'varchar(500)') AS 'cv_id'
    ,Courses.c.value('date[1]', 'varchar(500)') AS 'date'
    ,Courses.c.value('duration[1]', 'varchar(500)') AS 'duration'
    ,Courses.c.value('organizator[1]', 'varchar(500)') AS 'organizator'
    ,Courses.c.value('title[1]', 'varchar(500)') AS 'title'
    ,Courses.c.value('description[1]', 'varchar(max)') AS 'description'
    ,Courses.c.value('certificate_till[1]', 'varchar(500)') AS 'certificate_till'
INTO #XmlCourses
FROM #xmlDataParse
CROSS APPLY #xmlDataParse._xml.nodes('/response/applicant') T(c)
CROSS APPLY #xmlDataParse._xml.nodes('/response/applicant/courses') Courses(c)
ORDER BY applicant_id ASC

Я привел пример xml, который я пытаюсь проанализировать ниже

<response>
<applicant>
    <applicant_id>2090505093</applicant_id>
    <cv_id>880667422</cv_id>
    <time>2020-02-04 00:26:00</time>
    <cover_letter />
    <questions_answers>
        <question_1 />
        <question_2 />
        <question_3 />
        <answer_1 />
        <answer_2 />
        <answer_3 />
    </questions_answers>
    <application_url>testUrl</application_url>
    <personal>
        <name>TestName</name>
        <gender>woman</gender>
        <birth_date>1992.09.25</birth_date>
        <city>TestCity</city>
        <phone>88888888</phone>
        <mail>TestEmail@email.com</mail>
        <description />
        <desired_salary>0</desired_salary>
        <updated_date />
    </personal>
    <education>
        <date_from>2010</date_from>
        <date_till>2013</date_till>
        <institution>TEST Institution</institution>
        <speciality>TEST</speciality>
        <degree>Professional</degree>
    </education>
    <courses>
        <date>2008.08</date>
        <duration>270</duration>
        <organizator>TEST</organizator>
        <title>TEST</title>
        <description>TEST</description>
        <certificate_till />
    </courses>
    <experience>
        <date_from>2017.01</date_from>
        <date_till>2019.12</date_till>
        <company> Romance Design</company>
        <company_www />
        <position> TEST </position>
        <description>TEST</description>
    </experience>
    <experience>
        <date_from>2014.09</date_from>
        <date_till>2017.01</date_till>
        <company>"Yves Rocher"</company>
        <company_www>
            <href>http://www.yvesrocher.ca/control/main/</href>
            <text>www.yvesrocher.ca/control/main/</text>
        </company_www>
        <position>(Malta)</position>
        <description>TEST DESCRIPTION</description>
    </experience>
    <experience>
        <date_from>2013.10</date_from>
        <date_till>2014.08</date_till>
        <company>Rampila</company>
        <company_www />
        <position>(Malta)</position>
        <description>DESCRIPTION TEST</description>
    </experience>
    <membership />
    <recommendations />
    <languages>
        <language>English</language>
        <write>5</write>
        <speak>5</speak>
        <understand>5</understand>
    </languages>
    <languages>
        <language>Russian</language>
        <write>2</write>
        <speak>2</speak>
        <understand>2</understand>
    </languages>
    <languages>
        <language>Norwegian</language>
        <write>2</write>
        <speak>2</speak>
        <understand>2</understand>
    </languages>
    <computer>
        <Software>
            <title>Photoshop</title>
            <c_experience>3-4 y.</c_experience>
        </Software>
    </computer>
    <extra />
    <image>
        <src>TEST FOTO URL</src>
    </image>
    <ad>
        <id>6557177</id>
        <imported_ad_id />
        <position>TEST POSITION</position>
        <city>Vilnius</city>
    </ad>
</applicant>
<applicant>
    <applicant_id>2090504647</applicant_id>
    <cv_id>1426533964</cv_id>
    <time>2020-02-03 23:46:02</time>
    <cover_letter>TEST2</cover_letter>
    <questions_answers>
        <question_1 />
        <question_2 />
        <question_3 />
        <answer_1 />
        <answer_2 />
        <answer_3 />
    </questions_answers>
    <application_url>TEST2</application_url>
    <personal>
        <name>TEST2</name>
        <gender>man</gender>
        <birth_date>1987.10.02</birth_date>
        <city>TEST2</city>
        <phone>+37067658006</phone>
        <mail>TEST2</mail>
        <description>TEST2</description>
        <desired_salary>0</desired_salary>
        <updated_date />
    </personal>
    <education>
        <date_from>2008</date_from>
        <date_till>2010</date_till>
        <institution>TEST2</institution>
        <speciality>TEST2</speciality>
        <degree>Higher/Bachelor</degree>
    </education>
    <education>
        <date_from>2006</date_from>
        <date_till>2008</date_till>
        <institution>TEST2</institution>
        <speciality>TEST2</speciality>
        <degree>Professional</degree>
    </education>
    <education>
        <date_from>2003</date_from>
        <date_till>2006</date_till>
        <institution>TEST2</institution>
        <speciality />
        <degree>Secondary</degree>
    </education>
    <courses>
        <date>2018.05</date>
        <duration>0</duration>
        <organizator>LFF</organizator>
        <title>TEST2</title>
        <description>TEST2</description>
        <certificate_till />
    </courses>
    <courses>
        <date>2011</date>
        <duration>0</duration>
        <organizator>FIFA</organizator>
        <title>TEST2</title>
        <description>TEST2</description>
        <certificate_till />
    </courses>
    <experience>
        <date_from>2004</date_from>
        <date_till>Present</date_till>
        <company>LFTA</company>
        <company_www>
            <href>http://www.lfta.lt</href>
            <text>www.lfta.lt</text>
        </company_www>
        <position>TEST2</position>
        <description>TEST2</description>
    </experience>
    <experience>
        <date_from>2019.08</date_from>
        <date_till>2019.11</date_till>
        <company>UAB Tekita</company>
        <company_www />
        <position>vadybininkas</position>
        <description>TEST2</description>
    </experience>
    <experience>
        <date_from>2019.03</date_from>
        <date_till>2019.06</date_till>
        <company>UAB Elektpro</company>
        <company_www>
            <href>http://www.palapiniumagnatai.lt</href>
            <text>www.palapiniumagnatai.lt</text>
        </company_www>
        <position>TEST2</position>
        <description>TESt2</description>
    </experience>
    <experience>
        <date_from>2007</date_from>
        <date_till>2016</date_till>
        <company>Mars TEST2</company>
        <company_www>
            <href>TESTURL</href>
            <text>TEST URL TEXT</text>
        </company_www>
        <position>TEST2</position>
        <description>TEST5</description>
    </experience>
    <membership />
    <recommendations />
    <languages>
        <language>Russian</language>
        <write>5</write>
        <speak>5</speak>
        <understand>5</understand>
    </languages>
    <languages>
        <language>English</language>
        <write>4</write>
        <speak>4</speak>
        <understand>5</understand>
    </languages>
    <languages>
        <language>Spanish</language>
        <write>2</write>
        <speak>2</speak>
        <understand>3</understand>
    </languages>
    <computer>
        <Software>
            <title>Excel</title>
            <c_experience>1-2 y.</c_experience>
        </Software>
        <Software>
            <title>PowerPoint</title>
            <c_experience>4 y. and more.</c_experience>
        </Software>
        <Software>
            <title>Word</title>
            <c_experience>4 y. and more.</c_experience>
        </Software>
        <OS>
            <title>Windows</title>
            <c_experience>4 y. and more.</c_experience>
        </OS>
    </computer>
    <extra>
        <driving_categories>
            <category>B</category>
            <experience_year>3</experience_year>
        </driving_categories>
        <hobbies>TEST H</hobbies>
    </extra>
    <image>
        <src>img.jpg</src>
    </image>
    <ad>
        <id>6559735</id>
        <imported_ad_id />
        <position>TEDST </position>
        <city>TEST</city>
    </ad>
</applicant>
</response>

1 Ответ

0 голосов
/ 05 февраля 2020

Кажется, я понял это сам, но мне не удается соединить узлы вместе.

Правильный способ - соединить их вместе, используя псевдоним T (c)

Ниже приведен пример

CROSS APPLY #xmlDataParse ._ xml .nodes ('/ response / заявитель') T (c)
CROSS APPLY T. c .nodes ( «образование») как образование (c))

IF OBJECT_ID('tempdb..#XmlApplicant') IS NOT NULL DROP TABLE #XmlApplicant
SELECT T.c.value('applicant_id[1]', 'varchar(500)') AS 'applicant_id'
    ,T.c.value('cv_id[1]', 'varchar(500)') AS 'cv_id'
    ,T.c.value('time[1]', 'varchar(500)') AS 'time'
    ,T.c.value('cover_letter[1]', 'varchar(max)') AS 'cover_letter'
    ,T.c.value('questions_answers[1]/question_1[1]', 'varchar(500)') AS 'question_1'
    ,T.c.value('questions_answers[1]/question_2[1]', 'varchar(500)') AS 'question_2'
    ,T.c.value('questions_answers[1]/question_3[1]', 'varchar(500)') AS 'question_3'
    ,T.c.value('questions_answers[1]/answer_1[1]', 'varchar(500)') AS 'answer_1'
    ,T.c.value('questions_answers[1]/answer_1[1]', 'varchar(500)') AS 'answer_2'
    ,T.c.value('questions_answers[1]/answer_1[1]', 'varchar(500)') AS 'answer_3'
    ,T.c.value('application_url[1]', 'varchar(500)') AS 'application_url'
    ,T.c.value('personal[1]/name[1]', 'varchar(500)') AS 'name'
    ,T.c.value('personal[1]/gender[1]', 'varchar(500)') AS 'gender'
    ,T.c.value('personal[1]/birth_date[1]', 'varchar(500)') AS 'birth_date'
    ,T.c.value('personal[1]/city[1]', 'varchar(500)') AS 'city'
    ,T.c.value('personal[1]/phone[1]', 'varchar(500)') AS 'phone'
    ,T.c.value('personal[1]/mail[1]', 'varchar(500)') AS 'mail'
    ,T.c.value('personal[1]/description[1]', 'varchar(500)') AS 'description'
    ,T.c.value('personal[1]/desired_salary[1]', 'varchar(500)') AS 'desired_salary'
    ,T.c.value('personal[1]/updated_date[1]', 'varchar(500)') AS 'updated_date'
    ,SUBSTRING(T.c.value('personal[1]/name[1]', 'varchar(500)'), 1, CHARINDEX(' ', T.c.value('personal[1]/name[1]', 'varchar(500)')) - 1) AS Vardas
    ,REVERSE(SUBSTRING(REVERSE(T.c.value('personal[1]/name[1]', 'varchar(500)')), 1, CHARINDEX(' ', REVERSE(T.c.value('personal[1]/name[1]', 'varchar(500)'))) - 1)) AS Pavarde
    ,Education.c.value('date_from[1]', 'varchar(500)') AS 'date_from'
    ,Education.c.value('date_till[1]', 'varchar(500)') AS 'date_till'
    ,Education.c.value('institution[1]', 'varchar(500)') AS 'institution'
    ,Education.c.value('speciality[1]', 'varchar(500)') AS 'speciality'
    ,Education.c.value('degree[1]', 'varchar(500)') AS 'degree'
INTO #XmlApplicant
FROM #xmlDataParse
CROSS APPLY #xmlDataParse._xml.nodes('/response/applicant') T(c)
CROSS APPLY T.c.nodes('education') as Education(c)
ORDER BY applicant_id ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...