برنامه نویسی

Power Automate – مدیریت XML

Summarize this content to 400 words in Persian Lang
Power Automate بر روی JSON (Notation Object JavaScript) ساخته شده است، هر ورودی و خروجی در قالب JSON خواهد بود، و این عالی است زیرا بهترین است. این یک زبان جهانی است که می توانیم از آن برای صحبت با هر سیستم دیگری از طریق API آنها استفاده کنیم، اما این تنها زبان نیست. در واقع Dynamics اصلی (که Dataverse و Power Platform بر روی آن ساخته شده است) JSON نبود، بلکه XML بود (به همین دلیل است که شما هنوز هم می توانید درخواست های XML را در جداول Dataverse انجام دهید). XML هنوز به طور گسترده مورد استفاده قرار می گیرد، بنابراین این وبلاگ به این موضوع می پردازد که چگونه می توانید آن را در جریان خود مدیریت کنید.

XML چیست
NameSpaces
Xpath
به روز رسانی XML

1. XML چیست

XML مخفف 'Extensible Markup Language' است و یک زبان نشانه گذاری کاملاً انعطاف پذیر است. در جایی که HTML یک زبان نشانه گذاری است، کاملاً منعطف نیست زیرا باید از برچسب های توافق شده فرامتن پیروی کند (شما می توانید مانند جکوزی/حمام آبگرم فکر کنید، زیرا HTML یک نوع XML است، اما XML یک نوع XML نیست. نوع HTML – عجب مثال تصادفی وجود دارد).

بنابراین XML به شما امکان می دهد از هر تگ استفاده کنید () که برای ساخت ساختارهای داده سفارشی برای ارسال داده بین سیستم ها عالی است.

جوانب مثبت / منفی

چرا XML هنوز استفاده می شود، خوب مزایای آن، به ویژه:

آسان برای خواندنخواندن XML بسیار آسان است، با تگ بسته شدن در مقایسه با یک } عمومی، می توانید XML تو در تو را بخوانید.

همه جا هستاگر چه ممکن است “تاریخ” از بین نرود، API هایی وجود دارند که تغییر نمی کنند، و فیل 800 پوندی در اتاق وجود دارد، HTML. همانطور که گفتم HTML XML است، بنابراین اگر می خواهید HTML را مدیریت کنید، باید XML را مدیریت کنید.

اما چند نکته منفی نیز برای XML وجود دارد، به خصوص در مقایسه با JSON، به همین دلیل است که Power Automate و اکثر API های جدید از آن استفاده می کنند.

پرمخاطب استدر مقایسه با JSON، کلمات/نویسه‌های بیشتری در بار وجود دارد، که سرعت تایپ آن را کندتر می‌کند و به داده‌های بیشتری نیاز دارد:

David Wyatt

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

json

“name”:{David Wyatt}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ساختار بازJSON اجازه کلیدهای تکراری را در یک شی نمی دهد، اما XML اجازه نمی دهد، که می تواند هنگام ترکیب اسناد XML از برنامه های مختلف XML مشکلاتی ایجاد کند:

David Wyatt
power platform

name>George Tzani</dev name>
Snr Dev
UK

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای اصلاح XML بالا از فضاهای نام استفاده می شود که عالی است اما دوباره پیچیدگی را اضافه می کند.

2. فضای نام

فضاهای نام تگ ها را گروه بندی می کند تا بتوان آنها را شناسایی/فیلتر کرد. آنها معمولاً یک URL به مستندات برای XML هستند، درست مانند یک JSON که یک URL طرحواره دارد.

شما می توانید فضاهای نام را با xmlns ویژگی های یک تگ، همه چیز تو در تو در تگ در فضای نام است.

xmlns=”http://example.com/library”>

XML Basics
John Doe

Advanced XML
Jane Smith

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما می‌توانید چندین فضای نام در یک تگ داشته باشید، اما هر برچسبی که به فضای نام پیوند داده می‌شود نیاز به یک پیشوند منحصر به فرد دارد که به فضای نام پیوند داده شده است.

xmlns:bk=”http://example.com/books”
xmlns:auth=”http://example.com/authors”>

XML Basics
John Doe

Advanced XML
Jane Smith

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. Xpath

Xpath راهی برای پرس و جو/پیمایش درخت XML است. اگر هر تگ را به‌عنوان یک پوشه روی دسک‌تاپ خود تصور می‌کنید، و روی پوشه‌های تودرتو کلیک می‌کنید و مسیری را در پنجره کاوشگر می‌بینید، xpath این میان‌بر است، اما با چند زنگ و سوت اضافی.

بنابراین اگر تمام کتاب های زیر را می خواستم از آن استفاده می کردم /library/book

XML Basics
John Doe

Advanced XML
Jane Smith

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این یک آرایه را برمی گرداند، بنابراین اگر من می خواستم اولین مورد را می توانستم استفاده کنم /library/book[0]. همچنین می‌توانم همه کتاب‌ها را در هر برچسبی با نوعی علامت عام بگیرم //book.

ساختار xpath ما به این صورت است:

بیان
توضیحات

برچسب زدن
همه تگ ها/گره های با نام “tagName” را انتخاب می کند

/
از تگ ریشه انتخاب می کند

//
برچسب‌هایی را در سند از برچسب فعلی انتخاب می‌کند که با انتخاب مطابقت دارند بدون توجه به اینکه کجا هستند

.
تگ فعلی را انتخاب می کند

..
والد تگ فعلی را انتخاب می کند

@
صفات را انتخاب می کند

Xpath همچنین می‌تواند و دیگر عبارات ریاضی را از آرایه‌ها جمع کند، بسیار قدرتمند است و می‌توانم تمام روز را ادامه دهم، اما منابع بسیار خوبی مانند https://www.w3schools.com/xml/xpath_intro.asp در حال حاضر در دسترس هستند.

یک تماس وجود دارد که می‌خواهم در اینجا انجام دهم، و اینکه موارد بالا با فضای نام یکسان کار نمی‌کنند.

اگر XML دارای پیشوند بود، می توان آنها را اضافه کرد و کار می کند، اما اگر فقط یک فضای نام باشد، xpath اکنون چیزی شبیه به:

/library/*[local-name()=’book’]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر فقط یک فضای نام در کل XML باشد، یا اگر یک فضای نام خاص:

/library/*[local-name()=’book’ and namespace-uri()=’http://example.com/library’]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Power Automate یک تابع xpath دارد، اما این تنها راه برای مدیریت XML نیست، در واقع 3 راه وجود دارد.

4. به روز رسانی XML

دستکاری رشته
دستکاری JSON
دستکاری XML

در قسمت زیر می خواهیم از این XML استفاده کنیم و می خواهیم تگ مکان را حذف کنیم (اگرچه این تکنیک ها با به روز رسانی/افزودن نیز کار می کنند).

xmlns=”http://example.com/library”>
UK

XML Basics
John Doe

Advanced XML
Jane Smith

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دستکاری رشته

من به شما اجازه می دهم یک راز را وارد کنید، اگرچه “بدن” ترین راه برای انجام آن، این یک نوع مورد علاقه من است.

در این رویکرد ما XML را به عنوان متن در نظر می گیریم و آن را ویرایش می کنیم. بهترین راه برای انجام این کار در Power Automate تابع ()recex است، اما به regex اجازه نمی دهد. بنابراین به جای آن از تابع split() استفاده می کنیم. می‌خواهیم xml را به 3 تقسیم کنیم، تا مکان، مکان، و بعد از مکان، سپس 1 و 3 را دوباره کنار هم قرار دهیم.

اولین عبارت مکان قبل و بعد را تقسیم می کند و اولین آرایه ما از 2 مورد را ایجاد می کند.

split(triggerBody()[‘text’],”)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دومی مورد دوم را به 2 تقسیم می کند و سپس مورد اول از آرایه اول را با آیتم دوم از آرایه دوم ترکیب می کند.

concat(
outputs(‘Split_xml’)[0] ,
split(outputs(‘Split_xml’)[1],”)[1] )

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر می خواستیم تگ جدید را ویرایش/افزودن کنیم، تگ جدید خود را بین موارد بالا اضافه می کنیم.

دستکاری JSON

Power Automate از JSON به‌عنوان زبان api، کم‌مطلب و استاندارد جدید استفاده می‌کند. بنابراین در این رویکرد ما قصد داریم به JSON تبدیل کنیم، تگ را حذف کنیم، دوباره به XML تبدیل کنیم.

عبارت اول XML را به JSON تبدیل می کند، اما از آنجایی که محتوا یک رشته است، نه XML، ابتدا آن را به XML تبدیل می کنیم.

json(xml(triggerBody()[‘text’]))

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

عبارت دوم از تابع removeProperty() برای حذف تگ مکان استفاده می کند. اگرچه به عنوان یک تگ تو در تو (داخل تگ کتابخانه)، باید ویژگی کتابخانه را با حذف ویژگی location به روز کنیم.

xml(setProperty(
outputs(‘Convert_to_JSON’)
,
‘library’
,
removeProperty(
outputs(‘Convert_to_JSON’)?[‘library’] ,
‘location’
)
))

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در نهایت با استفاده از تابع ()xml آن را به xml تبدیل می کنیم.

در اینجا تگ edit/add بسیار آسان است، ما فقط removeProperty() را به setProperty() / addProperty() تغییر می دهیم.

دستکاری XML

این راهی است که ما احتمالا باید آن را انجام دهیم، اما برای من کمی سخت است. ما نمی‌توانیم مانند JSON ویژگی‌ها را ویرایش/افزودن/حذف کنیم، بنابراین باید دستکاری رشته‌ها را نیز انجام دهیم.

ابتدا از تابع xpath() برای دریافت تگ موقعیت خود استفاده می کنیم، زیرا با تبدیل JSON نیز باید ابتدا آن را به xml تبدیل کنیم. برای دریافت تگ از عبارت زیر استفاده می کنیم:

xpath(
xml(triggerBody()[‘text’]))
,
‘//*[local-name()=”location”]’
)[0]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که آرایه ای از تمام تگ های مکان را برمی گرداند، باید اولین مورد را با موقعیت آرایه بگیریم [0].

فراخوانی کنید، اگر آیتم خاصی را در آرایه انتخاب نکرده باشید و کل آرایه را انتخاب کرده باشید، مجموعه ای از آیتم های base64 (مانند فایل ها، نمایش کلیدهای $content-type و $) را برمی گرداند، بنابراین شما نیاز خواهید داشت. به base64ToString() محتوای $ را تبدیل کنید.

یک مشکل کوچک، یک ویژگی نیز به تگ اضافه می کند، xmlns=”http://example.com/library”، که معمولاً مهم نیست، اما در این مورد خواهد بود (بعدا را ببینید). چرا این کار را انجام می دهد، به دلیل فضای نام. همانطور که قبلا گفته شد، اگر فضای نام را نداشتید، عبارت زیر کار می کند:

xpath(xml(triggerBody()[‘text’])),’//location’)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر می‌خواهید با فضای نامی هدف قرار دهید، آن را به xpath اضافه می‌کنید، بنابراین ما به شکل زیر خواهد بود:

/*[local-name()=”location” and namespace-uri()=”http://example.com/library”]/*[local-name()=”location”]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تنها دلیلی که من فضای نام و را وارد نکردم این است که لازم نیست، زیرا تنها یک فضای نام در XML وجود دارد.

پس چرا این یک مشکل است، خوب وقتی از local-name() استفاده می کنید، فضای نام را به صورت خودکار اضافه می کند. به خروجی xpath() ما نسبت داده شود (برای کمک به ردیابی آن در آینده). باز هم دیوید چرا این یک مشکل است، خوب به دلیل مرحله بعدی، ما قصد داریم از خروجی xpath() برای پیدا کردن و جایگزین کردن (در صورت ایجاد نوعی regex راه ما) استفاده کنیم، و این کار نمی کند زیرا اکنون کار نمی کند. تگ در XML مطابقت داشته باشد.

فضای نام نباید بدون فضای نام در xpath() اضافه شود، اما مایکروسافت تصمیم گرفت به هر حال آن را اضافه کند. در نهایت اکنون به اصل مطلب رسیدیم، به این معنی است که باید پارامتر فضای نام را از خروجی ()xpath خود حذف کنیم، و درست حدس زدید، بهترین راه این است که آن را به رشته تبدیل کرده و با '' جایگزین کنیم.

replace(
string(
xpath(
xml(triggerBody()[‘text’])
,
‘//*[local-name()=”location”]’
)[0] )
,
‘ xmlns=”http://example.com/library”‘
,

)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Callout، فضای سفید پیشرو xmkns را ببینید، که عمداً وجود دارد، آن را حذف نکنید

حالا ما یک تگ داریم که دقیقا مطابقت دارد، عبارت دوم ما از عبارت ()replace برای جایگزینی آن با '' استفاده می کند.

replace(
triggerBody()[‘text’])
,
outputs(‘Get_Protection’)
,

)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر می‌خواهید یک تگ اضافه کنید، می‌توانید آن را به خروجی xpath() متصل کنید، و اگر می‌خواهید آن را ویرایش کنید، می‌توانید فقط خروجی xpath() را ویرایش/بازسازی کنید.

هر 3 روش برای مدیریت کار XML، اما در بیشتر موارد می‌توانم بگویم تبدیل JSON بهترین است، با XML برای هر طرحواره‌ای خاص، اما من همچنان عاشق یک split() رشته‌ای خوب هستم.

جریان را می توان در راه حلی به نام XML در اینجا یافت.

Power Automate بر روی JSON (Notation Object JavaScript) ساخته شده است، هر ورودی و خروجی در قالب JSON خواهد بود، و این عالی است زیرا بهترین است. این یک زبان جهانی است که می توانیم از آن برای صحبت با هر سیستم دیگری از طریق API آنها استفاده کنیم، اما این تنها زبان نیست. در واقع Dynamics اصلی (که Dataverse و Power Platform بر روی آن ساخته شده است) JSON نبود، بلکه XML بود (به همین دلیل است که شما هنوز هم می توانید درخواست های XML را در جداول Dataverse انجام دهید). XML هنوز به طور گسترده مورد استفاده قرار می گیرد، بنابراین این وبلاگ به این موضوع می پردازد که چگونه می توانید آن را در جریان خود مدیریت کنید.

  1. XML چیست
  2. NameSpaces
  3. Xpath
  4. به روز رسانی XML

1. XML چیست

XML مخفف 'Extensible Markup Language' است و یک زبان نشانه گذاری کاملاً انعطاف پذیر است. در جایی که HTML یک زبان نشانه گذاری است، کاملاً منعطف نیست زیرا باید از برچسب های توافق شده فرامتن پیروی کند (شما می توانید مانند جکوزی/حمام آبگرم فکر کنید، زیرا HTML یک نوع XML است، اما XML یک نوع XML نیست. نوع HTML – عجب مثال تصادفی وجود دارد).

بنابراین XML به شما امکان می دهد از هر تگ استفاده کنید () که برای ساخت ساختارهای داده سفارشی برای ارسال داده بین سیستم ها عالی است.

جوانب مثبت / منفی

چرا XML هنوز استفاده می شود، خوب مزایای آن، به ویژه:

آسان برای خواندن
خواندن XML بسیار آسان است، با تگ بسته شدن در مقایسه با یک } عمومی، می توانید XML تو در تو را بخوانید.

همه جا هست
اگر چه ممکن است “تاریخ” از بین نرود، API هایی وجود دارند که تغییر نمی کنند، و فیل 800 پوندی در اتاق وجود دارد، HTML. همانطور که گفتم HTML XML است، بنابراین اگر می خواهید HTML را مدیریت کنید، باید XML را مدیریت کنید.

اما چند نکته منفی نیز برای XML وجود دارد، به خصوص در مقایسه با JSON، به همین دلیل است که Power Automate و اکثر API های جدید از آن استفاده می کنند.

پرمخاطب است
در مقایسه با JSON، کلمات/نویسه‌های بیشتری در بار وجود دارد، که سرعت تایپ آن را کندتر می‌کند و به داده‌های بیشتری نیاز دارد:

David Wyatt
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

json

"name":{David Wyatt}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ساختار باز
JSON اجازه کلیدهای تکراری را در یک شی نمی دهد، اما XML اجازه نمی دهد، که می تواند هنگام ترکیب اسناد XML از برنامه های مختلف XML مشکلاتی ایجاد کند:


   David Wyatt
   power platform



    name>George Tzani</dev name>
   Snr Dev
   UK

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای اصلاح XML بالا از فضاهای نام استفاده می شود که عالی است اما دوباره پیچیدگی را اضافه می کند.

2. فضای نام

فضاهای نام تگ ها را گروه بندی می کند تا بتوان آنها را شناسایی/فیلتر کرد. آنها معمولاً یک URL به مستندات برای XML هستند، درست مانند یک JSON که یک URL طرحواره دارد.

شما می توانید فضاهای نام را با xmlns ویژگی های یک تگ، همه چیز تو در تو در تگ در فضای نام است.



    xmlns="http://example.com/library">
    
        </span>XML Basics<span class="nt"/>
        <span class="nt"><author/></span>John Doe<span class="nt"/>
    <span class="nt"/>
    <span class="nt"><book/></span>
        <span class="nt"><title/></span>Advanced XML<span class="nt"/>
        <span class="nt"><author/></span>Jane Smith<span class="nt"/>
    <span class="nt"/>
<span class="nt"/></library></span>
</code></pre><div class="highlight__panel js-actions-panel"><div class="highlight__panel-action js-fullscreen-code-action">
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما می‌توانید چندین فضای نام در یک تگ داشته باشید، اما هر برچسبی که به فضای نام پیوند داده می‌شود نیاز به یک پیشوند منحصر به فرد دارد که به فضای نام پیوند داده شده است.



    xmlns:bk="http://example.com/books"
    xmlns:auth="http://example.com/authors">
    
        </span>XML Basics<span class="nt"/>
        <span class="nt"><author/></span>John Doe<span class="nt"/>
    <span class="nt"/>
    <span class="nt"><book/></span>
        <span class="nt"><title/></span>Advanced XML<span class="nt"/>
        <span class="nt"><author/></span>Jane Smith<span class="nt"/>
    <span class="nt"/>
<span class="nt"/></catalog></span>
</code></pre><div class="highlight__panel js-actions-panel"><div class="highlight__panel-action js-fullscreen-code-action">
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. Xpath

Xpath راهی برای پرس و جو/پیمایش درخت XML است. اگر هر تگ را به‌عنوان یک پوشه روی دسک‌تاپ خود تصور می‌کنید، و روی پوشه‌های تودرتو کلیک می‌کنید و مسیری را در پنجره کاوشگر می‌بینید، xpath این میان‌بر است، اما با چند زنگ و سوت اضافی.

بنابراین اگر تمام کتاب های زیر را می خواستم از آن استفاده می کردم /library/book



    
        </span>XML Basics<span class="nt"/>
        <span class="nt"><author/></span>John Doe<span class="nt"/>
    <span class="nt"/>
    <span class="nt"><book/></span>
        <span class="nt"><title/></span>Advanced XML<span class="nt"/>
        <span class="nt"><author/></span>Jane Smith<span class="nt"/>
    <span class="nt"/>
<span class="nt"/>
</code></pre><div class="highlight__panel js-actions-panel"><div class="highlight__panel-action js-fullscreen-code-action">
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این یک آرایه را برمی گرداند، بنابراین اگر من می خواستم اولین مورد را می توانستم استفاده کنم /library/book[0]. همچنین می‌توانم همه کتاب‌ها را در هر برچسبی با نوعی علامت عام بگیرم //book.

ساختار xpath ما به این صورت است:

بیانتوضیحات
برچسب زدنهمه تگ ها/گره های با نام “tagName” را انتخاب می کند
/از تگ ریشه انتخاب می کند
//برچسب‌هایی را در سند از برچسب فعلی انتخاب می‌کند که با انتخاب مطابقت دارند بدون توجه به اینکه کجا هستند
.تگ فعلی را انتخاب می کند
..والد تگ فعلی را انتخاب می کند
@صفات را انتخاب می کند

Xpath همچنین می‌تواند و دیگر عبارات ریاضی را از آرایه‌ها جمع کند، بسیار قدرتمند است و می‌توانم تمام روز را ادامه دهم، اما منابع بسیار خوبی مانند https://www.w3schools.com/xml/xpath_intro.asp در حال حاضر در دسترس هستند.

یک تماس وجود دارد که می‌خواهم در اینجا انجام دهم، و اینکه موارد بالا با فضای نام یکسان کار نمی‌کنند.

اگر XML دارای پیشوند بود، می توان آنها را اضافه کرد و کار می کند، اما اگر فقط یک فضای نام باشد، xpath اکنون چیزی شبیه به:

/library/*[local-name()='book']
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر فقط یک فضای نام در کل XML باشد، یا اگر یک فضای نام خاص:

/library/*[local-name()='book' and namespace-uri()='http://example.com/library']
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Power Automate یک تابع xpath دارد، اما این تنها راه برای مدیریت XML نیست، در واقع 3 راه وجود دارد.

4. به روز رسانی XML

در قسمت زیر می خواهیم از این XML استفاده کنیم و می خواهیم تگ مکان را حذف کنیم (اگرچه این تکنیک ها با به روز رسانی/افزودن نیز کار می کنند).



    xmlns="http://example.com/library">
    UK
    
        </span>XML Basics<span class="nt"/>
        <span class="nt"><author/></span>John Doe<span class="nt"/>
    <span class="nt"/>
    <span class="nt"><book/></span>
        <span class="nt"><title/></span>Advanced XML<span class="nt"/>
        <span class="nt"><author/></span>Jane Smith<span class="nt"/>
    <span class="nt"/>
<span class="nt"/></library></span>
</code></pre><div class="highlight__panel js-actions-panel"><div class="highlight__panel-action js-fullscreen-code-action">
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دستکاری رشته

من به شما اجازه می دهم یک راز را وارد کنید، اگرچه “بدن” ترین راه برای انجام آن، این یک نوع مورد علاقه من است.

در این رویکرد ما XML را به عنوان متن در نظر می گیریم و آن را ویرایش می کنیم. بهترین راه برای انجام این کار در Power Automate تابع ()recex است، اما به regex اجازه نمی دهد. بنابراین به جای آن از تابع split() استفاده می کنیم. می‌خواهیم xml را به 3 تقسیم کنیم، تا مکان، مکان، و بعد از مکان، سپس 1 و 3 را دوباره کنار هم قرار دهیم.

جریان رشته

اولین عبارت مکان قبل و بعد را تقسیم می کند و اولین آرایه ما از 2 مورد را ایجاد می کند.

split(triggerBody()['text'],'')
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دومی مورد دوم را به 2 تقسیم می کند و سپس مورد اول از آرایه اول را با آیتم دوم از آرایه دوم ترکیب می کند.

concat(
    outputs('Split_xml')[0]
,
    split(outputs('Split_xml')[1],'')[1]
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر می خواستیم تگ جدید را ویرایش/افزودن کنیم، تگ جدید خود را بین موارد بالا اضافه می کنیم.

دستکاری JSON

Power Automate از JSON به‌عنوان زبان api، کم‌مطلب و استاندارد جدید استفاده می‌کند. بنابراین در این رویکرد ما قصد داریم به JSON تبدیل کنیم، تگ را حذف کنیم، دوباره به XML تبدیل کنیم.

جریان json

عبارت اول XML را به JSON تبدیل می کند، اما از آنجایی که محتوا یک رشته است، نه XML، ابتدا آن را به XML تبدیل می کنیم.

json(xml(triggerBody()['text']))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

عبارت دوم از تابع removeProperty() برای حذف تگ مکان استفاده می کند. اگرچه به عنوان یک تگ تو در تو (داخل تگ کتابخانه)، باید ویژگی کتابخانه را با حذف ویژگی location به روز کنیم.

xml(setProperty(
    outputs('Convert_to_JSON')
,
    'library'
,
    removeProperty(
        outputs('Convert_to_JSON')?['library']
    ,
        'location'
    )
))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در نهایت با استفاده از تابع ()xml آن را به xml تبدیل می کنیم.

در اینجا تگ edit/add بسیار آسان است، ما فقط removeProperty() را به setProperty() / addProperty() تغییر می دهیم.

دستکاری XML

این راهی است که ما احتمالا باید آن را انجام دهیم، اما برای من کمی سخت است. ما نمی‌توانیم مانند JSON ویژگی‌ها را ویرایش/افزودن/حذف کنیم، بنابراین باید دستکاری رشته‌ها را نیز انجام دهیم.

جریان xml

ابتدا از تابع xpath() برای دریافت تگ موقعیت خود استفاده می کنیم، زیرا با تبدیل JSON نیز باید ابتدا آن را به xml تبدیل کنیم. برای دریافت تگ از عبارت زیر استفاده می کنیم:

xpath(
    xml(triggerBody()['text']))
,
    '//*[local-name()="location"]'
)[0]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که آرایه ای از تمام تگ های مکان را برمی گرداند، باید اولین مورد را با موقعیت آرایه بگیریم [0].

فراخوانی کنید، اگر آیتم خاصی را در آرایه انتخاب نکرده باشید و کل آرایه را انتخاب کرده باشید، مجموعه ای از آیتم های base64 (مانند فایل ها، نمایش کلیدهای $content-type و $) را برمی گرداند، بنابراین شما نیاز خواهید داشت. به base64ToString() محتوای $ را تبدیل کنید.

یک مشکل کوچک، یک ویژگی نیز به تگ اضافه می کند، xmlns="http://example.com/library"، که معمولاً مهم نیست، اما در این مورد خواهد بود (بعدا را ببینید). چرا این کار را انجام می دهد، به دلیل فضای نام. همانطور که قبلا گفته شد، اگر فضای نام را نداشتید، عبارت زیر کار می کند:

 xpath(xml(triggerBody()['text'])),'//location')
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر می‌خواهید با فضای نامی هدف قرار دهید، آن را به xpath اضافه می‌کنید، بنابراین ما به شکل زیر خواهد بود:

/*[local-name()="location" and namespace-uri()="http://example.com/library"]/*[local-name()="location"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تنها دلیلی که من فضای نام و را وارد نکردم این است که لازم نیست، زیرا تنها یک فضای نام در XML وجود دارد.

پس چرا این یک مشکل است، خوب وقتی از local-name() استفاده می کنید، فضای نام را به صورت خودکار اضافه می کند. به خروجی xpath() ما نسبت داده شود (برای کمک به ردیابی آن در آینده). باز هم دیوید چرا این یک مشکل است، خوب به دلیل مرحله بعدی، ما قصد داریم از خروجی xpath() برای پیدا کردن و جایگزین کردن (در صورت ایجاد نوعی regex راه ما) استفاده کنیم، و این کار نمی کند زیرا اکنون کار نمی کند. تگ در XML مطابقت داشته باشد.

فضای نام نباید بدون فضای نام در xpath() اضافه شود، اما مایکروسافت تصمیم گرفت به هر حال آن را اضافه کند. در نهایت اکنون به اصل مطلب رسیدیم، به این معنی است که باید پارامتر فضای نام را از خروجی ()xpath خود حذف کنیم، و درست حدس زدید، بهترین راه این است که آن را به رشته تبدیل کرده و با '' جایگزین کنیم.

replace(
    string(
        xpath(
            xml(triggerBody()['text'])
        ,
            '//*[local-name()="location"]'
        )[0]
    )
,
    ' xmlns="http://example.com/library"'
,
    ''
)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Callout، فضای سفید پیشرو xmkns را ببینید، که عمداً وجود دارد، آن را حذف نکنید

حالا ما یک تگ داریم که دقیقا مطابقت دارد، عبارت دوم ما از عبارت ()replace برای جایگزینی آن با '' استفاده می کند.

replace(
    triggerBody()['text'])
,
    outputs('Get_Protection')
,
    ''
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر می‌خواهید یک تگ اضافه کنید، می‌توانید آن را به خروجی xpath() متصل کنید، و اگر می‌خواهید آن را ویرایش کنید، می‌توانید فقط خروجی xpath() را ویرایش/بازسازی کنید.


هر 3 روش برای مدیریت کار XML، اما در بیشتر موارد می‌توانم بگویم تبدیل JSON بهترین است، با XML برای هر طرحواره‌ای خاص، اما من همچنان عاشق یک split() رشته‌ای خوب هستم.

جریان را می توان در راه حلی به نام XML در اینجا یافت.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا