Правильный способ использования msbuild xmlpoke
Я пытаюсь установить значение для элемента, если значение элемента соответствует "ABB Automation Builder Platform.abpkg"
Мой скрипт использует xmlpoke, как показано ниже:
<XmlPoke
Namespaces="<Namespace Prefix='x' Uri='http://www150.abb.com/spaces/DAE-1/ProdDev/Shared%20Documents/40%20DAE%20Installer/Design/XML%20Descriptions/DAEInstaller_Description_StyleSheet' >"
Query="x:ProductUpdate/x:Packages/x:Package[x:FileName='ABB Automation Builder Platform.abpkg']/x:FileHash"
XmlInputPath="Output\update.manifest"
Value="Ajay Vishwakarma"/>
XML, который я пытаюсь изменить, находится ниже:
<?xml version="1.0" encoding="utf-8"?>
<ProductUpdate xmlns="http://www150.abb.com/spaces/DAE-1/ProdDev/Shared%20Documents/40%20DAE%20Installer/Design/XML%20Descriptions/DAEInstaller_Description_StyleSheet">
<Strings>
<Text id="1">
<Neutral>ABB Automation Builder 1.0 \nService Release 1</Neutral>
<Localized culture="en">ABB Automation Builder 1.0 \nService Release 1</Localized>
<Localized culture="de">ABB Automation Builder 1.0 \nService Release 1</Localized>
<Localized culture="fr">ABB Automation Builder 1.0 \nService Release 1</Localized>
<Localized culture="es">ABB Automation Builder 1.0 \nService Release 1</Localized>
<Localized culture="zh">ABB Automation Builder 1.0 \nService Release 1</Localized>
</Text>
<Text id="2">
<Neutral>Information\ABB Automation Builder Upate Package V1_0_1Description_en.htm</Neutral>
<Localized culture="en">Information\ABB Automation Builder Upate Package V1_0_1Description_en.htm</Localized>
<Localized culture="de">Information\ABB Automation Builder Upate Package V1_0_1Description_de.htm</Localized>
<Localized culture="fr">Information\ABB Automation Builder Upate Package V1_0_1Description_fr.htm</Localized>
<Localized culture="es">Information\ABB Automation Builder Upate Package V1_0_1Description_es.htm</Localized>
<Localized culture="zh">Information\ABB Automation Builder Upate Package V1_0_1Description_zh.htm</Localized>
</Text>
</Strings>
<ReleaseType>ServicePack</ReleaseType>
<ProductName>$1</ProductName>
<Version>1.0.1</Version>
<Description>$2</Description>
<License>
<Name>$3</Name>
<ID>45668677876463</ID>
<Description>$4</Description>
<Version>1.0.1</Version>
<DescriptionVersion>$5</DescriptionVersion>
<DescriptionTypeVersion>1.0.0</DescriptionTypeVersion>
<ToAccept>true</ToAccept>
</License>
<Copyright>$6</Copyright>
<MinimumRequiredVersion>1.0.0</MinimumRequiredVersion>
<Packages>
<Package>
<Name>ABB Automation Builder Platform Update Package</Name>
<Description>ABB Automation Builder Platform Update Package</Description>
<FileName>ABB Automation Builder Platform.abpkg</FileName>
<FileHash>AjayVishwakarma</FileHash>
<FileDownload>
</FileDownload>
<InstallerData>
<Component>
<Name>ABB Automation Builder Package Manager</Name>
<ID>{F5B05B3F-9FA5-476E-BDD3-DB1397CABF4C}</ID>
<Version>1.0.1.0</Version>
<InstallAlways>true</InstallAlways>
</Component>
</InstallerData>
</Package>
<Package>
<Name>PLC AC500 Update Package</Name>
<Description>PLC AC500 Update Package</Description>
<FileName>PLC - AC500.abpkg</FileName>
<FileHash>8652d588d4c1fe70e0e06a9cf3e09193</FileHash>
<FileDownload>
</FileDownload>
<InstallerData>
<Component>
<Name>Codesys</Name>
<ID>{F8A33E2A-5B6A-474B-8ED2-293B4982D4E6}</ID>
<Version>2.3.9.41</Version>
</Component>
<Component>
<Name>Target Support Package</Name>
<ID>{CC764263-BEF5-4060-AA49-0366AB2E868B}</ID>
<Version>1.0.1.0</Version>
</Component>
<Component>
<Name>Control Builder Plus documentation</Name>
<ID>{484D63DB-1EB6-4F4F-851F-7F7D7D34A396}</ID>
<Version>1.0.1.0</Version>
</Component>
</InstallerData>
</Package>
</Packages>
</ProductUpdate>
Задаче XmlPoke не удается обновить значение элемента и выдает сообщение "Произведена замена 0". Я также пытаюсь передать запрос, как
Query="//x:ProductUpdate/x:Packages/x: Пакет [x:FileName='ABB Automation Builder Platform.abpkg']/x:FileHash" OR Query=".//x:ProductUpdate/Packages/Package[FileName='ABB Automation Builder Platform.abpkg']/FileHash"
Я хочу знать, делаю ли я это неправильно? Обратите внимание, что я не хочу вносить какие-либо изменения в пространство имен в моем документе XML.
2 ответа
Ты не сумасшедший.
Это (в шестнадцатеричном коде) пробелы в исходном документе XML в пространстве имен отбрасывают вещи.
У меня нет ответа.
Но вот предложение.
Я всегда использую XmlPeek, а затем "собираю" запрос.
<XmlPeek Namespaces="<Namespace Prefix='peanut' Uri='http://www150.abb.com/spaces/DAE-1/ProdDev/Shared%20Documents/40%20DAE%20Installer/Design/XML%20Descriptions/DAEInstaller_Description_StyleSheet'/>"
XmlInputPath=".\MyXmlFile.xml"
Query="//peanut:ProductUpdate">
<Output TaskParameter="Result" ItemName="Peeked" />
</XmlPeek>
<Message Text="@(Peeked)"/>
(Выше XmlPeek у меня есть запрос верхнего уровня "//ProductUpdate". Сообщение @(Peeked) покажет фрагмент xml для этого. Затем я могу создать запрос и посмотреть результаты.... и настроить как необходимо.)
Во всяком случае, вернемся к проблеме:
Таким образом, вышесказанное сработает, если вы измените исходный XML
<ProductUpdate xmlns="http://www150.abb.com/spaces/DAE-1/ProdDev/Shared Documents/40 DAE Installer/Design/XML Descriptions/DAEInstaller_Description_StyleSheet">
<Strings>
Но с оригинальным Xml со значениями Hex для пробелов....... выше не будет работать.:(
Тем не мение. Разит. Это почти как пространство имен (в XmlPeek (или Poke) должно быть "закодировано в двойном шестнадцатеричном формате" или что-то в этом роде.
Извините, я попробовал в колледже.
Я думаю, вам нужно создать действительный элемент пространства имен. У вас есть открывающий тег, а не самозакрывающийся элемент. Вместо:
<Namespace Prefix='x'
Uri='http://www150.abb.com/spaces/..../DAEInstaller_Description_StyleSheet'>
Тебе нужно:
<Namespace Prefix='x'
Uri='http://www150.abb.com/spaces/..../DAEInstaller_Description_StyleSheet'/>