2014-10-28 74 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 ',' 
    }