Несколько атрибутов одного и того же файла XML - PullRequest
1 голос
/ 27 февраля 2012

Сценарий XQuery должен отображать все название компании и имя контакта, которые есть в файле xml.

Вот что у меня есть: -

for $x in doc("Customers.xml")/dataroot/Customers return $x/CompanyName $x/ContactName

Пример xml

<dataroot>
    <Customers>
        <CustomerID>ALFKI</CustomerID>
        <CompanyName>Alfreds Futterkiste</CompanyName>
        <ContactName>Maria Anders</ContactName>
        <ContactTitle>Sales Representative</ContactTitle>
        <Address>Obere Str. 57</Address>
        <City>Berlin</City>
        <PostalCode>12209</PostalCode>
        <Country>Germany</Country>
        <Phone>030-0074321</Phone>
        <Fax>030-0076545</Fax>
    </Customers>
    <Customers>
        <CustomerID>ANATR</CustomerID>
        <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>
        <ContactName>Ana Trujillo</ContactName>
        <ContactTitle>Owner</ContactTitle>
        <Address>Avda. de la Constitución 2222</Address>
        <City>México D.F.</City>
        <PostalCode>05021</PostalCode>
        <Country>Mexico</Country>
        <Phone>(5) 555-4729</Phone>
        <Fax>(5) 555-3745</Fax>
    </Customers>
    <Customers>
        <CustomerID>ANTON</CustomerID>
        <CompanyName>Antonio Moreno Taquería</CompanyName>
        <ContactName>Antonio Moreno</ContactName>
        <ContactTitle>Owner</ContactTitle>
        <Address>Mataderos  2312</Address>
        <City>México D.F.</City>
        <PostalCode>05023</PostalCode>
        <Country>Mexico</Country>
        <Phone>(5) 555-3932</Phone>
    </Customers>
    <Customers>
        <CustomerID>AROUT</CustomerID>
        <CompanyName>Around the Horn</CompanyName>
        <ContactName>Thomas Hardy</ContactName>
        <ContactTitle>Sales Representative</ContactTitle>
        <Address>120 Hanover Sq.</Address>
        <City>London</City>
        <PostalCode>WA1 1DP</PostalCode>
        <Country>UK</Country>
        <Phone>(171) 555-7788</Phone>
        <Fax>(171) 555-6750</Fax>
    </Customers>
    <Customers>
        <CustomerID>BERGS</CustomerID>
        <CompanyName>Berglunds snabbköp</CompanyName>
        <ContactName>Christina Berglund</ContactName>
        <ContactTitle>Order Administrator</ContactTitle>
        <Address>Berguvsvägen  8</Address>
        <City>Luleå</City>
        <PostalCode>S-958 22</PostalCode>
        <Country>Sweden</Country>
        <Phone>0921-12 34 65</Phone>
        <Fax>0921-12 34 67</Fax>
    </Customers>

Я хочу вернуть ТОЛЬКО CompanyName и ContactName. Их нужно легко преобразовать в формат таблицы, чтобы он был структурирован в столбцы

1 Ответ

1 голос
/ 29 февраля 2012

Базовая модель данных XQuery - это последовательность , а не таблица или отношение .Это относится и к result XQuery.Таким образом, по умолчанию вы получите последовательность, возвращаемую предложением return.Нет никаких «столбцов» или «таблиц» для возврата по умолчанию.Если вам нужна другая или более «структурированная» структура возврата, отличная от последовательности, вам придется добавить ее самостоятельно.

Самый простой способ получить структурированный результат - создать вывод XML.По этой причине большинство учебных пособий по XQuery начинаются с возврата XML, а не простого текста или чего-либо еще.

Если вам нужна «структура таблицы» в качестве выходных данных, у вас есть разные варианты:

  • выведите XML и импортируйте его в другое приложение;
  • выведите (X) HTML с таблицами HTML;
  • выведите CSV и импортируйте / проанализируйте его с помощью предпочитаемого программного обеспечения для работы с электронными таблицами.

Для вывода XML вы можете использовать следующее:

xquery version "1.0";
<table>
{
    for $cust in fn:doc("Customers.xml")/dataroot/Customers
    return
        <row>
        {
            $cust/CompanyName, $cust/ContactName
        }
        </row>
}
</table>

Будет возвращено что-то вроде:

<table>
    <row>
        <CompanyName>Alfreds Futterkiste</CompanyName>
        <ContactName>Maria Anders</ContactName>
    </row>
    <row>
        <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>
        <ContactName>Ana Trujillo</ContactName>
    </row>
    <row>
        <CompanyName>Antonio Moreno Taquería</CompanyName>
        <ContactName>Antonio Moreno</ContactName>
    </row>
    <row>
        <CompanyName>Around the Horn</CompanyName>
        <ContactName>Thomas Hardy</ContactName>
    </row>
    <row>
        <CompanyName>Berglunds snabbköp</CompanyName>
        <ContactName>Christina Berglund</ContactName>
    </row>
</table>

Для вывода в формате CSV (если быть более точным: последовательность CSV-как строки), вы можете использовать

xquery version "1.0";
for $cust in fn:doc("Customers.xml")/dataroot/Customers
return
concat('"', $cust/CompanyName, '"', ',', '"', $cust/ContactName, '"')

, чтобы получить что-то вроде

"Alfreds Futterkiste","Maria Anders"
"Ana Trujillo Emparedados y helados","Ana Trujillo"
"Antonio Moreno Taquería","Antonio Moreno"
"Around the Horn","Thomas Hardy"
"Berglunds snabbköp","Christina Berglund"

РЕДАКТИРОВАТЬ: Некоторые процессоры XQuery также предлагают встроенную сериализацию CSV.Например, процессор Zorba XQuery включает в себя модуль для анализа / сериализации CSV .

...