目前我正在开发一个PowerShell脚本,用于查找由名为Help and Manual的创作工具创建的XML文件中的标记问题。
有时候,我遇到了一个我自己无法解决的问题。
让我们想象一下我们有一个字符串:
<para styleclass="Table Row Heading Text"><text style="font-size:12pt;">iso.outgoingQueueNameas</text></para>
我想要做的是创建一个与<text style="font-size:12pt;">.\*</text>
匹配的正则表达式,前提是字符串在开始时有<para styleclass="Table Row Heading Text">
,在结尾有</para>
个结束标记。更糟糕的是,除了<text style="font-size:12pt;">.*</text>
之外,<para>
元素中可能有任何文字,如下所示:
<para styleclass="Table Row Heading Text">some text<text style="font-size:12pt;">iso.outgoingQueueNameas</text>some text</para>
我知道我可以做一些初步检查,以确定一个字符串是以<para styleclass="Table Row Heading Text">
开头还是以<para>
结尾,然后使用一个相对简单的正则表达式得到我想要的,但是我我真的很感兴趣,如果它只能通过使用正则表达式来完成。
答案 0 :(得分:1)
不幸的是,你问的是如何用锤子拧入灯泡。您可能能够用锤子完成工作,但更可能的是灯泡最终会破碎。你应该问一下更换灯泡有哪些更好的工具。
/隐喻
您可能应该使用XPathDocument和XPathExpression来测试此XML片段以查找您正在寻找的条件。
我把你和一些类似元素共享的片段扔到文件xpathfragment.xml中:
<?xml version="1.0"?><xml>
<para styleclass="NOT Table Row Heading Text">some text<text style="font-size:12pt;">iso.otherstuffthings</text>other text></para>
<para styleclass="Table Row Heading Text">some text<text style="font-size:12pt;">iso.outgoingQueueNameas</text>some text</para>
<para styleclass="Table Row Heading Text">some text<text style="font-size:18pt;">iso.outgoingQueueNameas</text>some text</para>
</xml>
以下PowerShell脚本执行我认为您尝试执行的操作:
找到<text>
元素的内部文本,其'style'属性等于'font-size:12pt',其直接父级是<para>
元素,'styleclass'相等到'表行标题文字'
$filename = "c:\users\Username\Documents\xpathfragment.xml"
$xpDoc = [System.Xml.XPath.XPathDocument] $filename
$xpDocNavigator = $xpDoc.CreateNavigator()
$xpPathExpression = "/xml/para[@styleclass='Table Row Heading Text']/text[@style='font-size:12pt;']"
$xpDocNavigator.Evaluate($xpPathExpression)
这将从测试xml中返回单个结果:
Value : iso.outgoingQueueNameas
NodeType : Element
LocalName : text
NamespaceURI :
Name : text
Prefix :
BaseURI : file:///c:/users/Username/Documents/xpathfragment.xml
IsEmptyElement : False
NameTable : System.Xml.NameTable
HasAttributes : True
HasChildren : True
UnderlyingObject : iso.outgoingQueueNameas
LineNumber : 3
LinePosition : 53
IsNode : True
XmlType :
TypedValue : iso.outgoingQueueNameas
ValueType : System.String
ValueAsBoolean :
ValueAsDateTime :
ValueAsDouble :
ValueAsInt :
ValueAsLong :
XmlLang :
SchemaInfo :
CanEdit : False
OuterXml : <text style="font-size:12pt;">iso.outgoingQueueNameas</text>
InnerXml : iso.outgoingQueueNameas
我认为,值属性iso.outgoingQueueNameas
是您想要找到的内容。
您需要将xpath查询设计为在您正在使用的xml文档的上下文中工作,但上述内容应足以让您入门。你将学习一些学习曲线来获取xpath语法,但最后你会理解一个更适合xml搜索的工具。
答案 1 :(得分:0)
使用正则表达式解析XML容易出错,并且将来会给您带来问题。使用XML解析器解析器或根据模式验证它,比如DTD / XSD
答案 2 :(得分:0)
尝试使用the following regex,然后使用this answer
提取捕获组(?<=^<para styleclass="Table Row Heading Text">)(?:[^<]*)(<.*)(?=<\/para>)
它将捕获<
和<para styleclass="Table Row Heading Text">
之后的第一个</para>
之间的所有文字(不包括这些“边缘”)。
示例输入:
<para styleclass="Table Row Heading Text">some text<text style="font-size:12pt;">iso.outgoingQueueNameas</text><text style="font-size:12pt;">iso.outgoingQueueNameas</text></para>
捕获示例:
<text style="font-size:12pt;">iso.outgoingQueueNameas</text><text style="font-size:12pt;">iso.outgoingQueueNameas</text>