首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配语法问题

匹配语法问题
EN

Stack Overflow用户
提问于 2015-09-20 04:16:04
回答 1查看 248关注 0票数 1

我正在解析一个大型XML文件,以查找某些内容。

代码语言:javascript
复制
$matches = [regex]::matches($content, '(<ac:structured-macro.+?ac:name="jira".+?</ac:structured-macro>)'

即返回以"jira“作为起始部分和结束部分的<ac:structured-macro>

我发现的是也找到了其他的记录。

代码语言:javascript
复制
<ac:structured-macro blah blah </ac:structured-macro>
<ac:structured-macro blah ac:name="jira" blah </ac:structured-macro>

我只想找到那些里面有"jira“的。

  1. 我怎么告诉它,如果你找到了结尾“ac:结构化-宏”,而没有找到"jira“部分来重新启动搜索?
  2. 一旦我找到这个,我就需要在这场比赛中找到零件。.+?(item1).+?(item2)是语法吗?(类似于C#)

来源样本:

代码语言:javascript
复制
<ac:structured-macro ac:name="jira">
    <ac:parameter ac:name="columns">key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution</ac:parameter>
    <ac:parameter ac:name="server">JIRA (site.atlassian.net)</ac:parameter>
    <ac:parameter ac:name="serverId">72f475d9-a9b2</ac:parameter>
    <ac:parameter ac:name="jqlQuery">project = PLATFORM AND issuetype in (Bug, Question, Story) AND fixVersion = 1.12.1 AND component = &quot;UI Framework&quot;   </ac:parameter>
    <ac:parameter ac:name="maximumIssues">20</ac:parameter>
</ac:structured-macro>
EN

回答 1

Stack Overflow用户

发布于 2015-09-20 12:37:29

正如注释中提到的,不要对XML使用regex!

相反,使用.NET的内置功能来解析并使用它:

代码语言:javascript
复制
$XmlDoc = [xml](Get-Content .\largefile.xml) 

现在,$XmlDoc变量保存了一个活动的XmlDocument,我们可以通过编程方式检查和修改它(使用XPath),而不仅仅是纯文本。

从简短片段的内容来看,我猜想这个大型xml文件是包含JIRA宏for Confluence的XSLT模板。

因为Confluence使用了名称空间前缀ac --我们需要创建一个名称空间管理器,以便使用XPath查询文档

代码语言:javascript
复制
$XmlNSMgr = New-Object System.Xml.XmlNamespaceManager $XsltDoc.NameTable
$XmlNSMgr.AddNamespace("xsl","http://www.w3.org/1999/XSL/Transform")
$XmlNSMgr.AddNamespace("ac","http://www.atlassian.com/schema/confluence/4/ac/")

现在可以使用SelectNodes()方法和XPath表达式选择所需的节点:

代码语言:javascript
复制
$XPathExpression = '//ac:structured-macro'
$MacroNodes = $XmlDoc.SelectNodes($XPathExpression, $XmlNSMgr)

$MacroNodes现在是文档中所有<ac:structured-macro>节点的集合。

若要仅选择存在ac:name="jira"属性的节点,请向XPath表达式添加一个子句:

代码语言:javascript
复制
$XPathExpression = '//ac:structured-macro[@ac:name = "jira"]'
$JiraMacroNodes = $XmlDoc.SelectNodes($XPathExpression, $XmlNSMgr)

您甚至可以编辑节点,并且在保存编辑时文档将被修改:

代码语言:javascript
复制
$JiraMacroNodes |ForEach-Object {
    $_.SetAttribute("attrName","newValue")
}
$XmlDoc.Save("C:\path\to\new.xslt")
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32675746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档