Существует ли инструмент для автоматической замены набора идентификаторов GUID динамически генерируемыми?
Я не разработчик.
Мне нужно взломать XML-файл, чтобы дублировать сотни ресурсов, каждому из которых назначен GUID. Есть ли способ проанализировать весь файл, заменив каждый GUID, найденный в теге, на динамически сгенерированный?
В основном - каждый тег UniqueID (но не теги ContentUniqueID) нуждается в новом GUID.
<root xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<Name>[redacted]</Name>
<UniqueId>7a136c33-3ea8-4f99-8f99-bbe411972203</UniqueId>
<Enabled>true</Enabled>
<Behavior>EmptyOnly</Behavior>
<Subscriptions />
<ScheduledFormatTemplates>
<ScheduledFormatTemplate>
<Name>[redacted]</Name>
<UniqueId>1cfaba3e-bfd5-4d2f-a1df-14020ad2f7da</UniqueId>
<ContentUniqueId>67c58741-fe1b-4c15-8dc0-8b4c01f6f18f</ContentUniqueId>
<ScheduledContents>
<ScheduledContent xsi:type="SFTR">
<Name>[redacted]</Name>
<UniqueId>b4a60646-b62b-43e7-b2a2-7d37875ab33f</UniqueId>
<ContentUniqueId>ba634a97-9faf-4bfa-a9b4-d8a2475b82e6</ContentUniqueId>
<ScheduledContents>
<ScheduledContent>
<Name>[redacted]</Name>
<UniqueId>6f8e6e6c-1f94-4caa-8730-6859448138eb</UniqueId>
<ContentUniqueId>938b0a24-4043-4a16-bc2d-25dbdb21a659</ContentUniqueId>
</ScheduledContent>
</ScheduledContents>
</ScheduledContent>
</ScheduledContents>
</ScheduledFormatTemplate>
</ScheduledFormatTemplates>
</root>
2 ответа
Я не знаю такого инструмента, но разработчик должен иметь возможность создать сценарий powershell или perl, который делает это за 10-15 минут.
Если вы опубликуете образец файла XML, держу пари, что кто-то может даже выложить рабочий код. Если вы сформулируете свой вопрос как вызов, вы получите больше людей, чтобы ответить. В зависимости от сложности файла XML, это может быть всего 10 строк скрипта.
Если есть другие требования, такие как - если вы хотите, чтобы все новые GUID были выбраны из определенного диапазона - это все еще будет возможно и просто, но вам нужно будет указать все эти требования.
##
## ReplaceGuids.ps1
##
## Reads an XML document, and emits an output doc. The output replaces
## the Text value of each node in the input with LocalName="UniqueId", with
## a new Guid.
##
## Thu, 10 Dec 2009 12:06
##
# Create the XmlReader
$xr = [system.Xml.XmlReader]::Create("c:\data\Doug.xml")
# Create the XmlWriter
$sw = New-Object System.IO.StringWriter
$xw = New-Object System.Xml.XmlTextWriter $sw
$xw.Formatting = "indented"
$xw.Indentation = 2
$elementName = ""
# loop over each element in XmlReader
while ($true) {
if ($xr.Read() -eq $false) { break; }
switch ($xr.NodeType.ToString())
{
"Element" {
$xw.WriteStartElement($xr.Name)
$xw.WriteAttributes($xr, $false)
if ($xr.IsEmptyElement) { $xw.WriteEndElement(); $elementName = ""; }
else {$elementName = $xr.LocalName; }
}
"EndElement" {
$xw.WriteEndElement()
$elementName = ""
}
"Text" {
if ($elementName -eq "UniqueId") {
$guid = [System.Guid]::NewGuid()
$xw.WriteValue($guid.ToString())
} else {
$xw.WriteValue($xr.Value)
}
}
}
}
$xr.Close()
$xw.Flush()
$sw.Flush()
Write-Output $sw.ToString()