Как я могу удалить определенный узел в файле XML с помощью vbscript - PullRequest
0 голосов
/ 06 октября 2008

У меня проблема с тем, что я не могу выбрать конкретный узел XML, который необходимо удалить. Я уже пытался выбрать узел с помощью XPath, который отлично работает для некоторых файлов XML, но я не могу определить правильный XPath для узла в более сложном файле.

Кто-нибудь знает бесплатный инструмент, который может загрузить XML-файл, чтобы пользователь мог выбрать определенный узел и получить точный XPath, не имея перечисления в пути?

/root/anything[2] <- к сожалению, я не могу использовать такое утверждение, потому что номер элемента может измениться. Мне нужно выражение, основанное на атрибуте. </p>

Если для этой операции нет бесплатного инструмента, кто-нибудь знает другой способ, как я могу выбрать нужный узел?

Пример XML:

Корневой узел: SmsFormData

Атрибуты: xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd =" http://www.w3.org/2001/XMLSchema" FormatVersion = "1.0" xmlns = "http://schemas.microsoft.com/SystemsManagementServer/2005/03/ConsoleFramework"

Дочерний узел: Форма

Атрибуты: Id = "некоторый GUID" CustomData = "Некоторые данные" FormType = "некоторый тип" ForceRefresh = "false"

Дочерний / дочерний узел: Страницы

Дочерний / Дочерний / дочерний узел: Страница

Атрибуты: VendorId = "VendorName" Id = "некоторый GUID" Assembly = "имя файла dll" Пространство имен = "некоторое пространство имен" Тип = "некоторое Тип" HelpID = "">

Мое выражение xPath для выбора этой конкретной страницы теперь будет:

xPath = /SmsFormData/Form/Pages/Page[@Id="some Guid"]

Для выбора я использую следующий код vbscript:

Set objDOM = CreateObject("Msxml2.DOMDocument.4.0") 
objDOM.async = false            
objDOM.load(file)       
set objNode = objDOM.selectSingleNode(xPath)

Проблема в том, что объект objNode пуст. Узел не выбран, но почему?

Ответы [ 8 ]

2 голосов
/ 06 октября 2008

Это проблема пространства имен по умолчанию. Попробуйте добавить следующий код после загрузки в XML:

objDom.SetProperty "SelectionNamespaces", "xmlns:cf=""http://schemas.microsoft.com/SystemsManagementServer/2005/03/ConsoleFramework"""

Затем вы используете этот префикс cf в вашем XPath, например:

objDom.SelectSingleNode("/cf:SmsFormData/cf:Form/cf:Pages/cf:Page[@Id='Some Guid']")

Хотя это может показаться немного странным, это намеренное поведение. Посмотрите на http://support.microsoft.com/kb/288147 для получения дополнительной информации, и вы можете найти http://msdn.microsoft.com/en-us/library/ms950779.aspx также полезным.

0 голосов
/ 20 января 2009

Не уверен, что вам это нужно, но у меня была похожая проблема.

У меня был сгенерированный приложением XML-файл, которым мне нужно было управлять. Это было в формате: <LoginData> <GeneralData> <LoginMask>65537</LoginMask> </GeneralData> <UserData> <User> <Username>TEST0</Username> ... </User> <User> <Username>TEST1</Username> ... </User> </UserData> </LoginData>

Мне нужно было сопоставить имя пользователя и удалить другие теги пользователя.

Потребовалось мне (будучи полным новичком в XML), чтобы разобраться с этим, но в конце я наткнулся на сопоставление на узле и удаление дочернего узла родительского узла:

для каждого x в oXmlDoc.documentElement.selectSingleNode ("UserData"). ChildNodes if x.getElementsByTagName ("Имя пользователя"). item (0) .text = "TEST1" тогда set exx = x.getElementsByTagName ("Имя пользователя"). item (0) wscript.echo (x.getElementsByTagName ( "Имя пользователя"). Пункт (0) .text) wScript.echo (x.nodename & ":" & x.text) x.parentNode.removeChild (х) конец, если Следующий

0 голосов
/ 06 октября 2008

Ваша проблема в том, что у вас есть пространство имен по умолчанию. Пространство имен XPaths по умолчанию всегда является пространством имен «без имени».

Вам нужно: -

sNamespaces = "xmlns:cf='http://schemas.microsoft.com/SystemsManagementServer/2005/03/ConsoleFramework'"
objDOM.setProperty "SelectionNamespaces", sNamespaces

Теперь вы можете использовать в своем XPath: -

xPath = "/cf:SmsFormData/cf:Form/cf:Pages/cf:Page[@Id=""some Guid""]"
0 голосов
/ 06 октября 2008

Хм, ... У меня такое впечатление, что проблема должна быть основана на файлах. Даже если я установлю свойство для SelectionLanguage и если я использую перечисленный XPath (который я получил с помощью FireFox XPather), нод Object по-прежнему остается пустым.

Кто-нибудь знает, что может быть не так? XML-файл поставляется с приложением Microsoft и, следовательно, должен быть действительным. По крайней мере, у меня нет проблем при открытии файла или использовании его в приложении, поэтому синтаксис должен быть в порядке.

Или, может быть, у кого-то есть функция vbscript, которая перебирает весь XML-файл, чтобы найти нужный узел для его удаления?

0 голосов
/ 06 октября 2008

Если у вас есть браузер Firefox, вы можете просто установить DOM Inspector (требуется только для Firefox 3.0) и расширения XPather. Затем вы можете перейти к нужному узлу в окне DOM Inspector, и соответствующий XPath будет отображен на панели инструментов XPather в том же окне.

DOM Inspector: https://addons.mozilla.org/en-US/firefox/addon/6622

XPather: https://addons.mozilla.org/en-US/firefox/addon/1192?id=1192

Кажется, что XPather использует атрибуты (а не перечисление), когда это возможно, чтобы идентифицировать узлы (по крайней мере, это то, что я обнаружил в своем небольшом эксперименте ...). Надеюсь, это поможет ...

0 голосов
/ 06 октября 2008

Вам нужно установить язык выбора на XPath, используя

objDOM.SetProperty "SelectionLanguage", "XPath"

Как только вы установите это свойство, вы сможете использовать полный XPath для доступа к любым элементам, которые вы хотите

0 голосов
/ 06 октября 2008

Спасибо за быстрый ответ! Это, безусловно, работает в простых случаях, но это не работает в моем конкретном случае: (

Итак, давайте углубимся в детали:

Корневой узел: SmsFormData

Атрибуты: xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd =" http://www.w3.org/2001/XMLSchema" FormatVersion = "1.0" xmlns = "http://schemas.microsoft.com/SystemsManagementServer/2005/03/ConsoleFramework"

Дочерний узел: Форма

Атрибуты: Id = "некоторый GUID" CustomData = "Некоторые данные" FormType = "некоторый тип" ForceRefresh = "false"

Дочерний / дочерний узел: Страницы

Дочерний / Дочерний / дочерний узел: Страница

Атрибуты: VendorId = "VendorName" Id = "некоторый GUID" Assembly = "имя файла dll" Пространство имен = "некоторое пространство имен" Тип = "некоторое Тип" HelpID = "">

Мое выражение xPath для выбора этой конкретной страницы теперь будет:

xPath ="/ SmsFormData / Form / Pages / Page [@ Id =" some Guid "]"

Для выбора я использую следующий код vbscript:

Set objDOM = CreateObject("Msxml2.DOMDocument.4.0") 

objDOM.async = false        
objDOM.load(file)       

set objNode = objDOM.selectSingleNode(xPath) 

Проблема теперь в том, что объект objNode пуст. Узел не выбран, но почему?

Да, кстати: спасибо за совет по Visual XPath! Я пытался использовать его, но, к сожалению, это делает способ перечисления: /

0 голосов
/ 06 октября 2008

С учетом следующего XML:

<root>
  <anything foo="bar">value1</anything>
  <anything foo="qux">value2</anything>
</root>

... вы можете получить значение второго узла any с помощью выражения XPath:

/root/anything[@foo="qux"]

(поэтому вместо нумерованного индекса в качестве селектора используется @ property = "value").

Что касается инструмента для автоматического создания таких запросов, то метко названный Visual XPath должен помочь, и он бесплатен (даже поставляется с исходным кодом C #).

Редактировать, следуя постеру: эта форма выбора XPath работает также и для «простых дел», как и для самых сложных документов. Вы, конечно, do должны убедиться, что ваше выражение XPath правильное, и хотя Visual XPath действительно будет использовать числовые индексы, оно по крайней мере даст вам остальное выражение, и вы можете легко заменить @property = селектор значения для числа и проверка результата.

Учитывая приведенный выше пример XML, этот VBscript:

objDOM.selectSingleNode("/root/anything[@foo=""qux""]/text()").nodeValue

... возвращает строку «value2»: в зависимости от ваших потребностей, вам может потребоваться немного изменить настройки (опять же, такие инструменты, как Visual XPath или любая хорошая ссылка на XPath помогут вам с что).

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