XMLPOKE في NANT - كيفية تحديث جميع مثيلات السلسلة التي تم العثور عليها
سؤال
مرحبًا ، أنا أستخدم XPath في برنامج Nant Build Script لتغيير بعض متغيرات التكوين بين التطوير وبيئاتي الأخرى.
لقد أخذت بناء الجملة من هذا المثال:
المثال يبدو هكذا:
<xmlpoke
file="config01/app.config"
xpath="/configuration/appSettings/add[@key='AppName']/@value"
value="TradeMonster">
</xmlpoke>
ما أوده هو شيء مشابه لهذا للبحث في سلاسل الاتصال الخاصة بي وإيجاد جميع حالات "LocalHost Sqlexpress" وتغييرها فقط إلى "مضيف محلي"
هل هذا ممكن؟
المحلول
لعب مع نص سريع قذر هنا ....
إذا كنت متأكدًا من أن هناك عنصرًا واحدًا فقط في كل ملف ، فيمكنك إنجاز هذا بمزيج من xmlpeek
و xmlpoke
. يتم تعديل السلسلة أسهل مع بعض C#، وبالتالي باستخدام مهمة نصية لإجراء بحث Regex واستبداله:
<script language="C#" prefix="custom" >
<code>
<![CDATA[
[Function("fix")]
public static string Fix(string input) {
return Regex.Replace(input, @"localhost\\\w+", "localhost");
}
]]>
</code>
</script>
<!-- Get the existing connection string -->
<xmlpeek
file="config01/app.config"
xpath="/configuration/connectionStrings/add[@contains(@connectionString,'localhost\')]/@connectionString"
property="connectionstring">
</xmlpeek>
<!-- Write back the modified connection string -->
<xmlpoke
file="config01/app.config"
xpath="/configuration/connectionStrings/add[@contains(@connectionString,'localhost\')]/@connectionString"
value="${custom::fix(connectionstring)}">
</xmlpoke>
نصائح أخرى
XPath يحدد العقد فقط ، لا يمكن تغيير العقد.
طريقة واحدة لإنجاز التغييرات المطلوبة هي إجراء تحويل XSLT على مستند XML.
من أجل تحقيق ذلك ، يجب عليك توفير مستند XML وتحديد أي من العقد النصية التي سيتم تغييرها بالضبط.