Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 05.10.2019
Сообщений: 4

Найти заданный текст и удалить тег, в который текст заключен

04.12.2019, 21:56. Показов 4958. Ответов 8

Студворк — интернет-сервис помощи студентам
Всем привет, есть такого вида xml файл
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    <ns:Document>
        <ns:Transfer>
            <tts:Header>
                <tts:TransferNumber>1-6856ce</tts:TransferNumber>
                <tts:TransferDate>2019-12-04</tts:TransferDate>
            </tts:Header>
            <tts:Content>
                <tts:Position>
                    <tts:Identity>88</tts:Identity>
                    <tts:ProductCode>003312</tts:ProductCode>
                    <tts:Quantity>3.000</tts:Quantity>
                    <tts:InformF2>
                        <pref2:F2RegId>FB-000111</pref2:F2RegId>
                    </tts:InformF2>
                </tts:Position>
                <tts:Position>
                    <tts:Identity>89</tts:Identity>
                    <tts:ProductCode>003213</tts:ProductCode>
                    <tts:Quantity>3.000</tts:Quantity>
                    <tts:InformF2>
                        <pref2:F2RegId>FB-000222</pref2:F2RegId>
                    </tts:InformF2>
                </tts:Position>
                <tts:Position>
                    <tts:Identity>110</tts:Identity>
                    <tts:ProductCode>00123</tts:ProductCode>
                    <tts:Quantity>6.000</tts:Quantity>
                    <tts:InformF2>
                        <pref2:F2RegId>FB-000333</pref2:F2RegId>
                    </tts:InformF2>
                </tts:Position>
и есть файл со списком

txt
FB-000111
FB-000333


надо найти в xml документе текст из списка и удалить все содержимое тега <tts:Position> и сам тег.
должно получиться так
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <ns:Document>
        <ns:Transfer>
            <tts:Header>
                <tts:TransferNumber>1-6856ce</tts:TransferNumber>
                <tts:TransferDate>2019-12-04</tts:TransferDate>
            </tts:Header>
            <tts:Content>
                <tts:Position>
                    <tts:Identity>89</tts:Identity>
                    <tts:ProductCode>003213</tts:ProductCode>
                    <tts:Quantity>3.000</tts:Quantity>
                    <tts:InformF2>
                        <pref2:F2RegId>FB-000222</pref2:F2RegId>
                    </tts:InformF2>
                </tts:Position>
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2019, 21:56
Ответы с готовыми решениями:

Найти символы и удалить текст который идет после этих символов
К примеру текст Light Brown Tortoise / Yellow Gold / #*Ruben H нужно чтоб было Light Brown Tortoise / Yellow Gold /

Удалить заданный текст из 5 ++ строки Memo
Доброго времени суток уважаемые программисты! :) Появилась необходимость написать функцию, которая удаляет указанный из Edit текст из...

В заданный непустой текст входят только цифры и буквы. Определить, удовлетворяет ли он следующему свойству: текст совпад
В заданный непустой текст входят только цифры и буквы. Определить, удовлетворяет ли он следующему свойству: текст совпадает с начальным...

8
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
05.12.2019, 09:10
У меня вот так получилось

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[xml]$doc = '
<root>
    <Position>
        <Identity>110</Identity>
        <ProductCode>00123</ProductCode>
        <Quantity>6.000</Quantity>
        <InformF2>
            <F2RegId>FB-000111</F2RegId>
        </InformF2>
    </Position>
    <Position>
        <Identity>110</Identity>
        <ProductCode>00123</ProductCode>
        <Quantity>6.000</Quantity>
        <InformF2>
            <F2RegId>FB-000222</F2RegId>
        </InformF2>
    </Position>
    <Position>
        <Identity>110</Identity>
        <ProductCode>00123</ProductCode>
        <Quantity>6.000</Quantity>
        <InformF2>
            <F2RegId>FB-000333</F2RegId>
        </InformF2>
    </Position>
</root>'
 
 
'FB-000111', 'FB-000333' | % {
    $nodeToRemove = $doc.SelectSingleNode("/root/Position[InformF2[F2RegId=`"$_`"]]")
    $nodeToRemove.ParentNode.RemoveChild($nodeToRemove)
}

ссылки по теме:

XPath Syntax
XmlNode.RemoveChild(XmlNode)
Принцип работы конвейеров

Добавлено через 1 час 43 минуты
Из за пространств имен на вашем файле скорее всего XPath запрос не сработает.
Если опубликуете файл полностью, попробую сделать, чтобы с пространствами имен тоже работало.
1
0 / 0 / 0
Регистрация: 05.10.2019
Сообщений: 4
07.12.2019, 22:18  [ТС]
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" encoding="UTF-8"?><ns:Documents xmlns:ain="http://fsrar.ru/WEGAIS/ActInventorySingle" xmlns:ainp="http://fsrar.ru/WEGAIS/ActChargeOn" xmlns:ainp2="http://fsrar.ru/WEGAIS/ActChargeOn_v2" xmlns:ains2="http://fsrar.ru/WEGAIS/ActChargeOnShop_v2" xmlns:aint="http://fsrar.ru/WEGAIS/ActInventoryInformBReg" xmlns:aint2="http://fsrar.ru/WEGAIS/ActInventoryInformF2Reg" xmlns:asiu="http://fsrar.ru/WEGAIS/Asiiu" xmlns:asiut="http://fsrar.ru/WEGAIS/AsiiuTime" xmlns:awr="http://fsrar.ru/WEGAIS/ActWriteOff" xmlns:awr2="http://fsrar.ru/WEGAIS/ActWriteOff_v2" xmlns:awrs2="http://fsrar.ru/WEGAIS/ActWriteOffShop_v2" xmlns:c="http://fsrar.ru/WEGAIS/Common" xmlns:crwb="http://fsrar.ru/WEGAIS/ConfirmRepealWB" xmlns:ctc="http://fsrar.ru/WEGAIS/ConfirmTicket" xmlns:nattn="http://fsrar.ru/WEGAIS/ReplyNoAnswerTTN" xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01" xmlns:ns63="http://fsrar.ru/WEGAIS/ReplyParentHistForm2" xmlns:ns64="http://fsrar.ru/WEGAIS/ActInventoryF1F2Info" xmlns:ns65="http://fsrar.ru/WEGAIS/ReplyHistoryShop" xmlns:ns66="http://fsrar.ru/WEGAIS/ActTTNSingle_v3" xmlns:ns67="http://fsrar.ru/WEGAIS/CommonV3" xmlns:ns68="http://fsrar.ru/WEGAIS/TTNSingle_v3" xmlns:ns69="http://fsrar.ru/WEGAIS/ActFixBarCode" xmlns:ns70="http://fsrar.ru/WEGAIS/ActInventoryABInfo" xmlns:ns71="http://fsrar.ru/WEGAIS/RequestAddFProducer" xmlns:ns72="http://fsrar.ru/WEGAIS/ActWriteOff_v3" xmlns:ns73="http://fsrar.ru/WEGAIS/RequestAddProducts" xmlns:ns74="http://fsrar.ru/WEGAIS/TTNHistoryF2Reg" xmlns:ns75="http://fsrar.ru/WEGAIS/ActUnFixBarCode" xmlns:ns76="http://fsrar.ru/WEGAIS/AscpNavigation" xmlns:ns77="http://fsrar.ru/WEGAIS/ReplyRests_Mini" xmlns:ns78="http://fsrar.ru/WEGAIS/ReplyRestsShop_Mini" xmlns:ns79="http://fsrar.ru/WEGAIS/RepImportedProduct_v3" xmlns:ns80="http://fsrar.ru/WEGAIS/RepProducedProduct_v3" xmlns:ns81="http://fsrar.ru/WEGAIS/ReplyWriteOffCheque" xmlns:ns82="http://fsrar.ru/WEGAIS/ReplyRestBCode" xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef" xmlns:oref2="http://fsrar.ru/WEGAIS/ClientRef_v2" xmlns:orefv="http://fsrar.ru/WEGAIS/ReplyClientVersion" xmlns:pref="http://fsrar.ru/WEGAIS/ProductRef" xmlns:pref2="http://fsrar.ru/WEGAIS/ProductRef_v2" xmlns:qbc="http://fsrar.ru/WEGAIS/QueryBarcode" xmlns:qf="http://fsrar.ru/WEGAIS/QueryFormAB" xmlns:qf2="http://fsrar.ru/WEGAIS/QueryFormF1F2" xmlns:qp="http://fsrar.ru/WEGAIS/QueryParameters" xmlns:qrri="http://fsrar.ru/WEGAIS/QueryRejectRepImported" xmlns:qrrp="http://fsrar.ru/WEGAIS/QueryRejectRepProduced" xmlns:rap="http://fsrar.ru/WEGAIS/ReplyAP" xmlns:rap2="http://fsrar.ru/WEGAIS/ReplyAP_v2" xmlns:rbc="http://fsrar.ru/WEGAIS/ReplyBarcode" xmlns:rc="http://fsrar.ru/WEGAIS/ReplyClient" xmlns:rc2="http://fsrar.ru/WEGAIS/ReplyClient_v2" xmlns:rfa="http://fsrar.ru/WEGAIS/ReplyFormA" xmlns:rfa2="http://fsrar.ru/WEGAIS/ReplyForm1" xmlns:rfb="http://fsrar.ru/WEGAIS/ReplyFormB" xmlns:rfb2="http://fsrar.ru/WEGAIS/ReplyForm2" xmlns:rfhb="http://fsrar.ru/WEGAIS/ReplyHistFormB" xmlns:rfhb2="http://fsrar.ru/WEGAIS/ReplyHistForm2" xmlns:ripf1="http://fsrar.ru/WEGAIS/RepInformF1Reg" xmlns:rpi="http://fsrar.ru/WEGAIS/RepImportedProduct" xmlns:rpp="http://fsrar.ru/WEGAIS/RepProducedProduct" xmlns:rraco="http://fsrar.ru/WEGAIS/RequestRepealACO" xmlns:rrawo="http://fsrar.ru/WEGAIS/RequestRepealAWO" xmlns:rrwb="http://fsrar.ru/WEGAIS/RequestRepealWB" xmlns:rs="http://fsrar.ru/WEGAIS/ReplySpirit" xmlns:rs2="http://fsrar.ru/WEGAIS/ReplySpirit_v2" xmlns:rssp="http://fsrar.ru/WEGAIS/ReplySSP" xmlns:rssp2="http://fsrar.ru/WEGAIS/ReplySSP_v2" xmlns:rst="http://fsrar.ru/WEGAIS/ReplyRests" xmlns:rst2="http://fsrar.ru/WEGAIS/ReplyRests_v2" xmlns:rsts2="http://fsrar.ru/WEGAIS/ReplyRestsShop_v2" xmlns:tc="http://fsrar.ru/WEGAIS/Ticket" xmlns:tfs="http://fsrar.ru/WEGAIS/TransferFromShop" xmlns:tts="http://fsrar.ru/WEGAIS/TransferToShop" xmlns:wa="http://fsrar.ru/WEGAIS/ActTTNSingle" xmlns:wa2="http://fsrar.ru/WEGAIS/ActTTNSingle_v2" xmlns:wb="http://fsrar.ru/WEGAIS/TTNSingle" xmlns:wb2="http://fsrar.ru/WEGAIS/TTNSingle_v2" xmlns:wbfu="http://fsrar.ru/WEGAIS/InfoVersionTTN" xmlns:wbr="http://fsrar.ru/WEGAIS/TTNInformBReg" xmlns:wbr2="http://fsrar.ru/WEGAIS/TTNInformF2Reg">
    <ns:Owner>
        <ns:FSRAR_ID>020000911111</ns:FSRAR_ID>
    </ns:Owner>
    <ns:Document>
        <ns:TransferToShop>
            <tts:Header>
                <tts:TransferNumber>1-6856ce</tts:TransferNumber>
                <tts:TransferDate>2019-12-04</tts:TransferDate>
            </tts:Header>
            <tts:Content>
                <tts:Position>
                    <tts:Identity>88</tts:Identity>
                    <tts:ProductCode>0037340000001252271</tts:ProductCode>
                    <tts:Quantity>3.000</tts:Quantity>
                    <tts:InformF2>
                        <pref2:F2RegId>FB-000002720958338</pref2:F2RegId>
                    </tts:InformF2>
                </tts:Position>
                <tts:Position>
                    <tts:Identity>89</tts:Identity>
                    <tts:ProductCode>0000000000030746525</tts:ProductCode>
                    <tts:Quantity>3.000</tts:Quantity>
                    <tts:InformF2>
                        <pref2:F2RegId>FB-000002720758370</pref2:F2RegId>
                    </tts:InformF2>
                </tts:Position>
                <tts:Position>
                    <tts:Identity>110</tts:Identity>
                    <tts:ProductCode>0035543000002125440</tts:ProductCode>
                    <tts:Quantity>6.000</tts:Quantity>
                    <tts:InformF2>
                        <pref2:F2RegId>FB-000002707432670</pref2:F2RegId>
                    </tts:InformF2>
                </tts:Position>
                <tts:Position>
                    <tts:Identity>111</tts:Identity>
                    <tts:ProductCode>0031656000001229054</tts:ProductCode>
                    <tts:Quantity>6.000</tts:Quantity>
                    <tts:InformF2>
                        <pref2:F2RegId>FB-000002719063542</pref2:F2RegId>
                    </tts:InformF2>
                </tts:Position>
                <tts:Position>
                    <tts:Identity>112</tts:Identity>
                    <tts:ProductCode>0031656000001229054</tts:ProductCode>
                    <tts:Quantity>6.000</tts:Quantity>
                    <tts:InformF2>
                        <pref2:F2RegId>FB-000002757336612</pref2:F2RegId>
                    </tts:InformF2>
                </tts:Position>          
            </tts:Content>
        </ns:TransferToShop>
    </ns:Document>
</ns:Documents>
Вот полный,количество tts:Position всегда разное
0
 Аватар для volodin661
6685 / 2277 / 347
Регистрация: 10.12.2013
Сообщений: 7,861
08.12.2019, 21:47
Лучший ответ Сообщение было отмечено inzar92 как решение

Решение

Собственно, удалить теги можно и без powershell, прямо в редакторе.
А редактор у профессионала конечно же vim [ ]

А дел в редакторе на пол-копейки:
  1. поискать вперёд заданную строку "FB-000002719063542"
  2. затем поискать назад тэг "<tts:Position>"
  3. удалить всё содержимое этого тэга

И так для всех тэгов из списка. Например для подстрок:
FB-000002719063542,
FB-000002757336612,
FB-000002720958338

поискать вперёд: /FB-000002719063542 <Enter>
поискать назад: ?<tts:Position> <Enter>
курсор стоит на тэге; удалить содержимое тэга: dat ( delete a tag )

пишем vim-script

my_script.vim
Code
1
2
3
4
:for item in [ "FB-000002719063542", "FB-000002757336612", "FB-000002720958338" ]
:   exec "norm /" . item . "\<CR>" . "?<tts:Position>\<CR>" . "dat" 
:endfor
:exit
запускаем на исполнение
PowerShell
1
vim -S my_script.vim fsrar.xml
1
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
09.12.2019, 07:53
Лучший ответ Сообщение было отмечено inzar92 как решение

Решение

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[xml]$doc = Get-Content 'C:\tmp\tmp.xml'
$ns = New-Object System.Xml.XmlNamespaceManager($doc.NameTable)
$ns.AddNamespace("ns", "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01");
$ns.AddNamespace("tts", "http://fsrar.ru/WEGAIS/TransferToShop");
$ns.AddNamespace("pref2", "http://fsrar.ru/WEGAIS/ProductRef_v2");
cls
 
Get-Content 'C:\tmp\tmp.txt' | % {
    $nodeToRemove = $doc.SelectSingleNode("//ns:Document/ns:TransferToShop/tts:Content/tts:Position[tts:InformF2/pref2:F2RegId=`"$_`"]", $ns)
    IF ($nodeToRemove)
    {
        $nodeToRemove.ParentNode.RemoveChild($nodeToRemove)
    }
}
 
$doc.Save('C:\tmp\tmp_out.xml')
1
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
09.12.2019, 17:42
Друзья, может буду неправ, но давайте подумаем хорошенько: у нас есть валидный xml-документ, узлы которого имеют префиксы, при этом согласно условию задачи нужно оставить какой-то один узел tts:Position со всеми потомками, - какой смысл перечислять предварительно значения, которые нужно удалить?! В смысле, FB-..., FB-... и так далее, когда средствами XPath можно извлечь из документа все узлы, подлежащие удалению. Чтобы было понятней:
PowerShell
1
2
3
4
5
$xml = [xml](Get-Content X:\path\input.xml)
$xml.SelectNodes('//*[name()="pref2:F2RegId" and not(text()="FB-000002719063542")]/../..').ForEach{
  $_.ParentNode.RemoveChild($_) # удаляем все узлы за исключением tts:Identity равный 111
}
$xml.Save('X:\path\input.xml')
Получим:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<ns:Documents xmlns:ain="http://fsrar.ru/WEGAIS/ActInventorySingle" xmlns:ainp="http://fsrar.ru/WEGAIS/ActChargeOn" xmlns:ainp2="http://fsrar.ru/WEGAIS/ActChargeOn_v2" xmlns:ains2="http://fsrar.ru/WEGAIS/ActChargeOnShop_v2" xmlns:aint="http://fsrar.ru/WEGAIS/ActInventoryInformBReg" xmlns:aint2="http://fsrar.ru/WEGAIS/ActInventoryInformF2Reg" xmlns:asiu="http://fsrar.ru/WEGAIS/Asiiu" xmlns:asiut="http://fsrar.ru/WEGAIS/AsiiuTime" xmlns:awr="http://fsrar.ru/WEGAIS/ActWriteOff" xmlns:awr2="http://fsrar.ru/WEGAIS/ActWriteOff_v2" xmlns:awrs2="http://fsrar.ru/WEGAIS/ActWriteOffShop_v2" xmlns:c="http://fsrar.ru/WEGAIS/Common" xmlns:crwb="http://fsrar.ru/WEGAIS/ConfirmRepealWB" xmlns:ctc="http://fsrar.ru/WEGAIS/ConfirmTicket" xmlns:nattn="http://fsrar.ru/WEGAIS/ReplyNoAnswerTTN" xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01" xmlns:ns63="http://fsrar.ru/WEGAIS/ReplyParentHistForm2" xmlns:ns64="http://fsrar.ru/WEGAIS/ActInventoryF1F2Info" xmlns:ns65="http://fsrar.ru/WEGAIS/ReplyHistoryShop" xmlns:ns66="http://fsrar.ru/WEGAIS/ActTTNSingle_v3" xmlns:ns67="http://fsrar.ru/WEGAIS/CommonV3" xmlns:ns68="http://fsrar.ru/WEGAIS/TTNSingle_v3" xmlns:ns69="http://fsrar.ru/WEGAIS/ActFixBarCode" xmlns:ns70="http://fsrar.ru/WEGAIS/ActInventoryABInfo" xmlns:ns71="http://fsrar.ru/WEGAIS/RequestAddFProducer" xmlns:ns72="http://fsrar.ru/WEGAIS/ActWriteOff_v3" xmlns:ns73="http://fsrar.ru/WEGAIS/RequestAddProducts" xmlns:ns74="http://fsrar.ru/WEGAIS/TTNHistoryF2Reg" xmlns:ns75="http://fsrar.ru/WEGAIS/ActUnFixBarCode" xmlns:ns76="http://fsrar.ru/WEGAIS/AscpNavigation" xmlns:ns77="http://fsrar.ru/WEGAIS/ReplyRests_Mini" xmlns:ns78="http://fsrar.ru/WEGAIS/ReplyRestsShop_Mini" xmlns:ns79="http://fsrar.ru/WEGAIS/RepImportedProduct_v3" xmlns:ns80="http://fsrar.ru/WEGAIS/RepProducedProduct_v3" xmlns:ns81="http://fsrar.ru/WEGAIS/ReplyWriteOffCheque" xmlns:ns82="http://fsrar.ru/WEGAIS/ReplyRestBCode" xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef" xmlns:oref2="http://fsrar.ru/WEGAIS/ClientRef_v2" xmlns:orefv="http://fsrar.ru/WEGAIS/ReplyClientVersion" xmlns:pref="http://fsrar.ru/WEGAIS/ProductRef" xmlns:pref2="http://fsrar.ru/WEGAIS/ProductRef_v2" xmlns:qbc="http://fsrar.ru/WEGAIS/QueryBarcode" xmlns:qf="http://fsrar.ru/WEGAIS/QueryFormAB" xmlns:qf2="http://fsrar.ru/WEGAIS/QueryFormF1F2" xmlns:qp="http://fsrar.ru/WEGAIS/QueryParameters" xmlns:qrri="http://fsrar.ru/WEGAIS/QueryRejectRepImported" xmlns:qrrp="http://fsrar.ru/WEGAIS/QueryRejectRepProduced" xmlns:rap="http://fsrar.ru/WEGAIS/ReplyAP" xmlns:rap2="http://fsrar.ru/WEGAIS/ReplyAP_v2" xmlns:rbc="http://fsrar.ru/WEGAIS/ReplyBarcode" xmlns:rc="http://fsrar.ru/WEGAIS/ReplyClient" xmlns:rc2="http://fsrar.ru/WEGAIS/ReplyClient_v2" xmlns:rfa="http://fsrar.ru/WEGAIS/ReplyFormA" xmlns:rfa2="http://fsrar.ru/WEGAIS/ReplyForm1" xmlns:rfb="http://fsrar.ru/WEGAIS/ReplyFormB" xmlns:rfb2="http://fsrar.ru/WEGAIS/ReplyForm2" xmlns:rfhb="http://fsrar.ru/WEGAIS/ReplyHistFormB" xmlns:rfhb2="http://fsrar.ru/WEGAIS/ReplyHistForm2" xmlns:ripf1="http://fsrar.ru/WEGAIS/RepInformF1Reg" xmlns:rpi="http://fsrar.ru/WEGAIS/RepImportedProduct" xmlns:rpp="http://fsrar.ru/WEGAIS/RepProducedProduct" xmlns:rraco="http://fsrar.ru/WEGAIS/RequestRepealACO" xmlns:rrawo="http://fsrar.ru/WEGAIS/RequestRepealAWO" xmlns:rrwb="http://fsrar.ru/WEGAIS/RequestRepealWB" xmlns:rs="http://fsrar.ru/WEGAIS/ReplySpirit" xmlns:rs2="http://fsrar.ru/WEGAIS/ReplySpirit_v2" xmlns:rssp="http://fsrar.ru/WEGAIS/ReplySSP" xmlns:rssp2="http://fsrar.ru/WEGAIS/ReplySSP_v2" xmlns:rst="http://fsrar.ru/WEGAIS/ReplyRests" xmlns:rst2="http://fsrar.ru/WEGAIS/ReplyRests_v2" xmlns:rsts2="http://fsrar.ru/WEGAIS/ReplyRestsShop_v2" xmlns:tc="http://fsrar.ru/WEGAIS/Ticket" xmlns:tfs="http://fsrar.ru/WEGAIS/TransferFromShop" xmlns:tts="http://fsrar.ru/WEGAIS/TransferToShop" xmlns:wa="http://fsrar.ru/WEGAIS/ActTTNSingle" xmlns:wa2="http://fsrar.ru/WEGAIS/ActTTNSingle_v2" xmlns:wb="http://fsrar.ru/WEGAIS/TTNSingle" xmlns:wb2="http://fsrar.ru/WEGAIS/TTNSingle_v2" xmlns:wbfu="http://fsrar.ru/WEGAIS/InfoVersionTTN" xmlns:wbr="http://fsrar.ru/WEGAIS/TTNInformBReg" xmlns:wbr2="http://fsrar.ru/WEGAIS/TTNInformF2Reg">
  <ns:Owner>
    <ns:FSRAR_ID>020000911111</ns:FSRAR_ID>
  </ns:Owner>
  <ns:Document>
    <ns:TransferToShop>
      <tts:Header>
        <tts:TransferNumber>1-6856ce</tts:TransferNumber>
        <tts:TransferDate>2019-12-04</tts:TransferDate>
      </tts:Header>
      <tts:Content>
        <tts:Position>
          <tts:Identity>111</tts:Identity>
          <tts:ProductCode>0031656000001229054</tts:ProductCode>
          <tts:Quantity>6.000</tts:Quantity>
          <tts:InformF2>
            <pref2:F2RegId>FB-000002719063542</pref2:F2RegId>
          </tts:InformF2>
        </tts:Position>
      </tts:Content>
    </ns:TransferToShop>
  </ns:Document>
</ns:Documents>
Как работает в данном случае запрос XPath?
Code
1
//*[name()="pref2:F2RegId"
Ищем узлы по имени pref2:F2RegId
Code
1
and
расширяем условия поиска
Code
1
not(text()="FB-000002719063542")]
в данном случае отсеиваем узел по соответствию тексту, и
Code
1
/../..
получаем родителей узла. Далее, в цикле, удаляем узлы критерия.
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
10.12.2019, 06:42
Цитата Сообщение от greg zakharov Посмотреть сообщение
'//*[name()="pref2:F2RegId" and not(text()="FB-000002719063542")]/../..'
Интересный вариант

Цитата Сообщение от greg zakharov Посмотреть сообщение
при этом согласно условию задачи нужно оставить какой-то один узел tts:Position со всеми потомками
я конечно не знаю, что там у клиента за задачи, но думаю это весьма частный случай, а что удобнее удалять узлы из списка или оставлять узлы вне списка думаю зависит от случая.
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
10.12.2019, 09:53
alhaos, есть множество нюансов по теме. Во-первых, inzar92 указал в начальном вопросе, что признаки удаляемых узлов берутся из файла-списка. Во-вторых, в PowerShell реализация XPath 2 частичная и некоторые конструкции попросту не срабатывают, в то время как в XSLT процессорах все нормально. Как одно вяжется с другим? Так как XPath запрос представлен строкой и поддерживает множественную выборку, можно предварительно формировать запрос параметрами из файла-списка, однако нужно учитывать тот фактор, что число операция обращения к диску\SSD возрастает, снижая производительность сценария. По этой причине, если нужно оставить всего одно единственное значение (точнее узел с заданным значением), проще найти скоп узлов, а после удалить их в цикле. Что же касается идеологически верного решения (и это всего лишь личное мнение), лучше вообще ничего не удалять, а обработку XML доверить XSLT.
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
10.12.2019, 12:19
greg zakharov, Опять мы обсуждаем, то что в данном конкретном случае не существенно, а вопрос о масштабируемости с подобными условиями зависит о множества неизвестных условий. XSLT в пользу XPath не исключаю, возможно даже за, но XSLT вещь в освоении явно не простая и осваивать ее человеку ради... опять упершемся в вопрос того во что это можно развить... а уж как... может изначально XML тут не лучший вариант.

в общем, для меня тут очень мало вводных чтобы делать выводы, да и кто я такой..., если кто то может делать выводы куда этот кусок разовьется во времени, на основе данной информации мой решпект и уважуха!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.12.2019, 12:19
Помогаю со студенческими работами здесь

Удалить из txt-файла текст, вставить в него текст из буфера обмена, удалить пробелы
Нужно открыть текстовик (например D:\temp.txt) , удалить предыдущий текст (или просто удалить сам файл а потом создать новый...

Есть ли софт, который позволяет в rtf\doc найти и править определенный текст но не слову, а шрифту (например удалить\заменить все что подчекнуто)?
или например, найти\заменить все что выделено красным и т.д.... Единственное, что еще важно так это возможность пакетной обработки....

Есть некий тег нужно из него извлечь определёны текст, тег меняется в зависимости от комнды
&lt;div class=&quot;covSmallHeadline&quot; style=&quot;width:100%;float:left;&quot;&gt;Natus Vincere&lt;/div&gt; &lt;div class=&quot;covSmallHeadline&quot;...

В заданный непустой текст входят только цифры и буквы. Определить удовлетворяет ли он следующему свойству:Текст является записью числа кратного 4.
В заданный непустой текст входят только цифры и буквы. Определить удовлетворяет ли он следующему свойству:Текст является записью числа...

Удалить текст, который был добавлен аяксом
есть optionы, по выбору которых отправляется аякс запрос и достает некий текст. Этот текст подставляется в другие optionы. Нужно при каждом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru