C # -мерить XML-файлы, но сохранить все из двух файлов, включая номер версии - PullRequest
0 голосов
/ 27 октября 2009

Предположим, у меня есть два XML-файла.

Первый XML-файл:

<?xml version="1.0"?>
    <AccessRequest xml:lang="en-US">
        <AccessLicenseNumber>Your_License</AccessLicenseNumber>
        <UserId>Your_ID</UserId>
        <Password>Your_Password</Password>
    </AccessRequest>

Второй файл XML:

   <?xml version="1.0"?>
    <RatingServiceSelectionRequest xml:lang="en-US">
     <CustomerContext>Rating and Service</CustomerContext>
    </RatingServiceSelectionRequest>

Теперь, когда я объединяю их два, я хочу вывод, подобный этому:

<?xml version="1.0"?>
<AccessRequest xml:lang="en-US">
    <AccessLicenseNumber>Your_License</AccessLicenseNumber>
    <UserId>Your_ID</UserId>
    <Password>Your_Password</Password>
</AccessRequest>
<?xml version="1.0"?>
<RatingServiceSelectionRequest xml:lang="en-US">
  <CustomerContext>Rating and Service</CustomerContext>
</RatingServiceSelectionRequest>

Когда я объединяю эти два файла, используя обычные методы, найденные в Google, номер версии и т. Д. Расходуется, и узел RatingServiceSelectionRequest оказывается частью узла AccessRequest, что явно не то, что я хочу.

Как мне подойти к этому в C # .Net?

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

Ответы [ 3 ]

4 голосов
/ 27 октября 2009

Вы не можете иметь два узла верхнего уровня

<AccessRequest>

и

<RatingServiceSelectionRequest>

в правильно сформированном XML-файле - это по определению - правильно сформированный XML-файл имеет один и ровно один корневой узел.

Кроме того, у вас не может быть двух инструкций обработки XML <?xml version="1.0"?> в одном файле - скорее всего, нет одной в середине файла.

Так что вам нужно будет либо ввести новый «искусственный» корень, либо прикрепить XML к другому корневому элементу, либо что-то в этом роде.

Если вы действительно должны сохранить этот формат, то вы просто объединяете два файла в виде строк:

string file1Contents = File.ReadAllText(@"file1.xml");
string file2Contents = File.ReadAllText(@"file2.xml");

File.WriteAllText(@"merged.xml", file1Contents + file2Contents);

Здесь нет магии XML ....

0 голосов
/ 27 октября 2009

Этот API выглядит знакомо;)

Мы используем то же самое здесь, и они действительно требуют одно за другим. Я предполагаю, что вы также используете .xsd, предоставляемый с API, для генерации ваших классов запросов.

С учетом всего сказанного мы создали «вспомогательный» класс, который сериализует оба запроса (доступ и скорость) в строку, объединяет строку и отправляет результат в виде байтового массива на целевой URL.

Прорыв наших классов:

Вспомогательный класс -> сериализует объект и возвращает его в виде строки (в данном случае это строка XML)

Клиентский класс -> создает байтовый массив, который отправляется через WebRequest в целевую систему.

0 голосов
/ 27 октября 2009

«Потеря» заголовка xml (между прочим, обычно желаемая функция), вероятно, является результатом использования методов слияния XML / DOM для объединения. Вместо этого, просто читая файлы как обычный текст и записывая их последовательно.

Как отмечает Marc S, это приведет к неверному XML-файлу, но если это то, что вам нужно / нужно ...

Перечитывая вопрос, «жалоба» на содержание второго файла, вставляемого в конец узла из предыдущего файла, намекает на ваше желание сохранить действительный файл XML, хотя и тот, где данные из второго файла не интегрируется в этот узел. Поэтому вам обязательно нужно будет ввести дополнительный узел, который будет служить корневым узлом для комбинированных результатов. (на данный момент оба файла имеют собственный корневой элемент).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...