2014-10-28 75 views
0

我已經格式化這樣的XML文件:正則表達式匹配一個標籤,跳過了幾下,然後再配

<User> 
<FirstName>Foo Bar</FirstName> 
<LastName>Blah</LastName> 
<OtherStuff>...</OtherStuff> 
<More>...</More> 
<CompanyName>Foo</CompanyName> 
<EmailAddress>[email protected]</EmailAddress> 
</User> 
<User> 
... 

我想通過所有的XML文件的讀取,創建作爲輸出<FirstName>,<CompanyName>,<EmailAddress>,所以:

Foo Bar,Foo,[email protected] 
Name,User2,[email protected] 
FSds,Blah,[email protected] 

我利用的標籤下面的正則表達式

(?si)<FirstName>(.*?)</FirstName>.*?<CompanyName>(.*?)</CompanyName>\s*<EmailAddress>(.*?)</EmailAddress>' 

然而,這也返回一切FirstNameCompanyName

我在做什麼錯?

+0

爲什麼不考慮解析器來執行此任務? – hwnd 2014-10-28 16:53:16

+0

我只是需要這個快速和骯髒的方法來工作,因爲截止日期:P客戶端是國王和所有:-) – Pr0no 2014-10-28 16:58:12

+0

[不,你不](http://stackoverflow.com/a/1732454/1630171) 。 – 2014-10-28 20:47:46

回答

4

爲什麼不使用XML處理?

C:\PS> $xml = [xml]@' 
>>> <Users> 
>>> <User> 
>>> <FirstName>Foo Bar</FirstName> 
>>> <LastName>Blah</LastName> 
>>> <OtherStuff>...</OtherStuff> 
>>> <More>...</More> 
>>> <CompanyName>Foo</CompanyName> 
>>> <EmailAddress>[email protected]</EmailAddress> 
>>> </User> 
>>> </Users> 
>>> '@ 
C:\PS> "$($xml.Users.User.FirstName), $($xml.Users.User.CompanyName), $($xml.Users.User.EmailAddress)" 
Foo Bar, Foo, [email protected] 

您還沒有顯示完整的XML文檔,所以我猜測在頂級節點上。您需要根據XML文檔的結構進行調整。

+0

這是確定的快速和易於使用的方法。 – Matt 2014-10-28 17:27:32

0

我發現,如果你在下面的字符串建立它多行正則表達式可以更容易:

$String = @' 
<User> 
<FirstName>Foo Bar</FirstName> 
<LastName>Blah</LastName> 
<OtherStuff>...</OtherStuff> 
<More>...</More> 
<CompanyName>Foo</CompanyName> 
<EmailAddress>[email protected]</EmailAddress> 
</User> 
'@ 

$regex = @' 
(?ms).+?<FirstName>(.+?)</FirstName>.*? 
<CompanyName>(.+?)</CompanyName>.*? 
<EmailAddress>(.+?)</EmailAddress>.+? 
'@ 

$string -match $regex > $null 
$matches[1..3] -join ',' 



Foo Bar,Foo,[email protected] 

如果它是一個大的文件,你不想讀這一切在一次,你可以使用結束標記作爲分隔符:

Get-Content xmlfile.xml -Delimiter '</User>' | 
foreach { 
    if ($_ -match $regex) 
    {$matches[1..3] -join ',' 
    }