创建XSD以忽略标记

时间:2016-04-29 11:08:50

标签: html xml ssis xsd

是否可以构建一个将标签的内容视为文本的XSD?我正在尝试提取有时包含HTML标记的标记内容。 html没有固定的模式,并不总是存在。我只想从标签中提取所有文本。 e.g. <content>this is a new piece of content by <b>Person A</b></content>.我想仅提取"this is a new piece of content by <b>Person A</b>",但SSIS生成的模式自然包含这些标记。当我只添加一个简单的条目

<xs:element minOccurs="0" name="content" type="xs:string"></xs:element>

我收到以下错误,这并非意外。

  

[XML Source [5]]错误:XML Source无法处理XML   数据。元素&#34;内容&#34;不能包含子元素。内容   模型只是文本。

2 个答案:

答案 0 :(得分:1)

将XSD主要视为在有效的XML文档中描述允许的标记,而不是定义提取的方法。如果您将content的类型更改为xs:string,则表示content中不允许标记,只有文字,并且您获得的验证错误会反映出来这一点。

您想要的是选择content元素的 字符串值 。如果XPath的上下文没有自动将其结果转换为字符串值,则可以通过string() XPath函数显式执行此操作:

string(/path/to/particular/content)

这将返回content所有子项的字符串值的串联,省略所请求的标记。

更新:重新阅读您的问题,我发现您确实想要检索

"this is a new piece of content by <b>Person A</b>"

(包括b元素,而不是其字符串值)。这里,包装content元素显然必须在XSD中描述为具有混合内容(mixed="true")。以这种形式从XML文档中提取此数据通常涉及选择文本和元素节点的集合,并将这些节点序列化为单个字符串。我不太熟悉SSIS提供细节,但也许我在评论中提到的参考可能有所帮助。

答案 1 :(得分:1)

您在编写描述和限制数据的模式之间并没有非常清楚地区分(并且,我认为,以各种方式指导SSIS)以及您在某些时候想要编写的可执行代码以便提取您在特定时刻想要的数据。您似乎想要或需要几件事情:

  • 要在元素中允许不受约束的XML,您需要一个通配符;阅读/playsound元素。
  • 要仅提取元素中的文本,您需要XPath xsd:any函数(但请注意,您的示例string()不仅仅是"this is a new piece of content by <b>Person A</b>"的文本,还包含一个子项元件)。
  • 要提取content元素内容的序列化XML表示(这是您显然想要的,与您想要的相反),您需要序列化内容;有多种方法可以做到这一点。