Изменить XML-файл в пакете - PullRequest
4 голосов
/ 11 января 2011

Хорошо, так что я не очень знаком с использованием For / F. Я могу изменить его, если файл статичен и имеет заданное количество строк, которые я могу пропустить, а затем извлечь данные. В настоящее время я пытаюсь изменить файл .XML. Файл будет иметь различное количество строк, но всегда будет иметь следующий

</SyncWindow> </AutoSyncWindows> <SyncServiceConnections /> <DaysToRetainRecordedData>90</DaysToRetainRecordedData> <SyncRestartRequired>false</SyncRestartRequired> - <LastGroupsSynced>

Значение для <DaysToRetainRecordedData>90</DaysToRetainRecordedData> может отличаться, например <DaysToRetainRecordedData>30</DaysToRetainRecordedData>

Используя токены, какой самый эффективный способ найти этот файл .XML для этой строки и переписать его следующим <DaysToRetainRecordedData>0</DaysToRetainRecordedData>

Я не могу перезаписать весь файл .XML, так как они имеют уникальные ключи сервера, которые будут различаться на разных машинах. Поэтому мне нужно найти эту строку и отредактировать значение до 0. Какие-нибудь мысли? Если For / F не самый эффективный способ, я могу перейти к VBS, если это будет необходимо. Но это должно было бы быть вызвано из чистого шеллкода и сделало бы вещи немного более сложными.

1 Ответ

4 голосов
/ 11 января 2011

Самый элегантный, гибкий и безопасный способ сделать это - загрузить msxsl.exe , а затем использовать крошечную таблицу стилей XSLT, чтобы изменить только то значение, которое вы хотите в XML:

<!-- DaysToRetainRecordedData.xsl -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="newValue" select="0" />

  <!-- this template copies your input XML unchanged -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

  <!-- this template changes one single value -->
  <xsl:template match="DaysToRetainRecordedData/text()">
    <xsl:value-of select="$newValue" />
  </xsl:template>
</xsl:stylesheet>

Вызовите это в командной строке с помощью:

msxsl.exe input.xml DaysToRetainRecordedData.xsl –o output.xml newValue=0

Параметр командной строки newValue появится в программе XSL.

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