详细描述
现在参考附图描述本发明,其中相同的参考标号用于指示全文中相同的元素。在以下描述中,为说明起见,描述各种特定细节以便提供对本发明的彻底理解。然而,显然,本发明可无需这些特定细节来实现。在其他情况中,用框图形式示出了公知的结构和设备以便于描述本发明。
如本申请中所使用的,术语“组件”、“系统”等指的是计算机相关的实体,它们或者是硬件、硬件和软件的组合、软件或者是执行中的软件。例如,组件可以是,但不限于,运行在处理器上的进程、处理器、对象、可执行代码、执行的线程、程序和/或计算机。作为说明,运行在服务器上的应用程序和服务器本身都可以是组件。一个或多个组件可以驻留在进程和/或执行中的线程内,且组件可以位于一台计算机上和/或分布在两台或多台计算机之间。
如此处所使用的,术语“推断”和“推论”一般指的是从通过事件和/或数据捕捉到的一组观察值中推出或推断系统、环境和/或用户的状态的过程。推论例如可以被用来标识具体的上下文或动作,或者可以生成状态上的概率分布。推论可以是概率性的,即,基于对数据和事件的考虑进行对所关心的状态上的概率分布的计算。推论也可以指的是用于从一组事件和/或数据中组成更高级的事件的技术。这样的推论导致从一组观察到的事件和/或存储的事件数据中构造出新的事件或动作,而不论原先的事件是否在时间上紧密相关,也不论原先的事件和数据是来自一个还是若干个事件和数据源。
通过对位于改变了标记语言(例如,可扩展标记语言(XML))的风貌(landscape)的新兴程序设计语言之下的基本原理的仔细分解,本发明利用了经由轻量API来对标记语言数据(例如,XML)查询的支持。所利用的技术允许除对此处所述的XML结构以外还对数据模型进行查询。所利用的技术也可对用原本不支持XML的语言来构造XML值进行简化。尽管此处所述的方面针对XML实现,但可以理解和领会,此处公开的新颖的概念和功能也可在其他标记语言环境中应用。因此,这些其他实现被认为是本公开及其所附的权利要求书的一部分。
所述革新的各方面可允许将包括XQuery和SQL的查询语言一方面被分解成对集合的一般操作,另一方面被分解成对这些集合的元素的一组域专用操作。专用于任何集合的一般查询操作的示例有对集合的映射(例如,投影)函数、过滤来自集合的元素、将集合归组成分区、对集合排序以及集合上的聚集操作将其约简(reduce)成值。XML域中域专用操作(例如,动作)的示例包括诸如选择孩子、属性、后代、兄弟等的各种“轴”函数、创建新XML节点的元素构造以及节点修改。
数据库研究者很早就发现这些对集合的一般操作均是函子(functor)、独异点(monoid)或单子(monad)概念的示例。从而,这些操作满足众多代数性质,且允许理解形式的句法好处。作为示例,XQuery品牌环境中的FLOWR表达式是一种理解形式,且在任何方面都未绑定于在XML节点的集合上进行操作。相反,FLOWR表达式可用于表达对对象集合以及具有多行的关系表的复杂查询。
代替创建用于查询XML的专门语言,可用基于单子的查询能力来扩展通用语言,允许程序员使用广义概念的“集合”来查询任何形式的数据。本文献中描述的机制(例如,API)启用支持这些查询机制的模式和语言构造。
对于XML域专用操作,如由通用语言使用的用于导航和构造XML的常规API当与XPath轴以及如由以XML为中心的语言提供的面向表达式的元素和属性构造的规则性相比时,它们是非常命令性、高度复杂且不规则的。另外,传统API(例如,DOM(文档对象模型))也是相当重量的。
依此,本发明的各方面公开了用于操纵(例如,构造、查询、修改)XML的轻量、合理且简单的API,它与由底层应用程序和/或主机语言提供的一般查询基础架构接口。具体地,本发明可支持创建与文档中心相对的节点中心(例如,上下文无关)的XML。而且,各方面可启用与传统接口机制(例如,DOM)的命令性面向语句的风格相对的面向表达式的接口机制。
一开始,参考图1,示出了便于例如主机语言的应用程序与标记语言之间的交互的系统100。一般,系统100可包括允许应用程序与标记语言组件104接口并通信的应用程序编程接口(API)102。作为示例,API 102可便于诸如查询组件的应用程序在标记语言集合(例如,标记语言组件104)内导航,从而标识其中的所需节点。如可以理解,可通过在应用程序(例如,查询组件)中编写函数调用来实现API,这提供了对所需子例程的连接用于执行。因此,API可暗示,计算机中有用于执行操作的某些程序模块或API动作组件106可用或它被链接至现有程序以执行任务。
在以上示例中,API 102可采用1到M个API动作组件,其中M为整数。如图1中所示,1到M个API动作组件可被统称或个别称为API动作组件106。而且,尽管图1示出了API动作组件106集成于API 102,但可以理解和领会,API动作组件106的全部或其子集可远离所示组件。
此外,API 102可包括对象模型108。对象模型108可定义标记语言组件104专用的节点类型。换言之,对象模型108可便于从应用程序(主机语言)映射到标记语言组件104。如上参考API动作组件106所述,对象模型108可位于API组件102本地或远程。
API对象组件108的结构可包括以下节点类型和/或公共类。尽管以下描述了特定命名约定,但可以理解,可采用任何命名约定而不背离此处所述的本发明的新颖的概念以及所附权利要求书的范围。示例性对象模型的每一节点类型将在以下更详细描述。
class XName
该类XName表示由命名空间统一资源标识符(URI)和本地名组成的通用名。因为,根据本发明,元素和属性是以相同方式对待的,所以该类可被用来表示元素和属性两者的名字。系统可隐式地将串转换成这些名字。因此,用户不显式地构造XName。相反,用户可引用串名以及API 102来将串转换成XName。
class XAttribute
该类XAttribute可用来表示属性。例如,XAttribute类可用来以类型化方式获取属性的值。可以理解,属性不同于XML节点。
abstract class XNode
该类可用作各种XML节点类型的抽象基类。
class XComment :XNode
该类可继承表示文档中的注释的节点。换言之,如果在文档中存在注释,则注释可由XComment节点表示。例如,该类可继承表示XML文档的节点,诸如<!这是注释>。
class XProcessingInstruction :XNode
在示例中,该节点可用于表示XML处理指令,诸如<??>。
class XDeclaration :XNode
以上节点可表示XML声明,诸如<?xml version=“1.0”encoding=“UTF-8”?>。
class XDocumentType :XNode
该节点可用来表示XML文档类型声明,诸如<!DOCTYPE greeting SYSTEM“hello.dtd”>。
abstractclass XCharacterNode :XNode
class XCData :XCharacterNode
这是表示XML CData部分的示例性节点<![CDATA[这是CDATA部分]]>。
abstract class XContainer :XNode
这是用于具有孩子的节点的抽象基类。
class XElement :XContainer
这是具有从Xnode导出的抽象基类XContainer的节点。如上所述,可以理解,XContainer表示具有孩子的所有节点。例如,注释、处理指令等仅具有一个孩子或内容。另一方面,XElement和XDocument类可具有支持在此示例中被称为XContainer的该抽象基类的较低层的孩子。在一个示例中,该节点可表示XML元素,诸如<Customer Name=”Joe”>...</Customer>。
class XDocument :XContainer
在对示例性对象模型的讨论的最后,该节点XDocument可表示完整的XML文档。
现在参考图2,示出了根据一方面的替换系统200的框图。一般,系统200包括API组件202和标记语言集合204。API组件202可包括对象模型108、导航组件206、构造组件208、修改组件210和接收器组件212。这些动作组件(206、208、210)中的每一个可采用对象模型108来便于对于标记语言集合204的操作。这些组件(206、208、210)中的每一个参考以下附图更详细描述。
现在转向图3,在一个方面中,系统300可包括启用在标记语言集合204(例如XML片段和/或节点集合)中导航(例如,经由导航组件206)和检索结果数据的一般查询操作符的API 202。如图所示,标记语言集合204可包括1到N个组件,其中N为整数。可以理解,1到N个组件可被个别或统称为节点组件302。在所述示例中,可对于本地节点集合(例如,302)采用查询。另外,可以理解,集合204的概念可包括位于远程(例如,来自不同的机器/位置)的节点302。在此情形中,查询机制(例如,导航组件206)可便于基于查询准则标识相关节点。
其他方面针对使用表达式树来代替使用委托的实现查询。基本上,存在用户可执行查询的两种方式。一是对实际集合(例如,在存储器集合中),另一种是对远程集合。在远程集合情形中,查询不由委托表示,而是可由表达式树表示。从而,系统采用整个查询而非在不同步骤中执行查询。
现在参考图4,对于XML,示出了根据对象模型108的轴概念,它表示导航组件206的一种机制。更具体地,轴组件402表示在XML节点集合204中从给定节点302导航至其他节点302的机制。可以理解,XML结构中的集合204可表示由相互关联的节点302构成的分层树。从而,轴组件402是可便于导航通过该结构的一种方法。作为示例,在结构中的某点处,该轴组件402可允许标识给定节点的父亲、给定节点的所有孩子等。映射组件(未示出)结合对象模型108可便于这样的导航和/或树的有向走查(walk through)。
给定一节点或节点的集合(例如302),用户可能期望遍历树来标识孩子、父亲等或属性。API 202包含对应于用于访问属性和元素的各轴(例如,402)的若干新颖的方法和/或机制。
例如,这些示例性轴表达式可由相应的轴函数来表示。在以下示例中,在左侧列出了常规XPath品牌表达式。在右侧列出了根据本API 202的相应的轴表达式。
bib/book ==>bib.Element[s](″book″)
bib/* ==>bib.Elements()
book/@year ==>book.Attribute(″year″)
bib//book ==>bib/Descendants(″book″)
authors/ancestor::*==>authors.Ancestors()
一般,轴函数402可包含各个级别的功能。例如,可对于单个项目或对源集合来采用轴函数。而且,如有需要,轴组件402可将返回值限于具有特定名字的节点。从而,用户可限制集合上的搜索。作为其他示例,用户可在集合中查询特定节点的所有孩子元素或共享某一名字的所有孩子元素。
而且,轴函数可用来将返回值限于特定类型。这在搜索值(例如,仅给出类型串或类型整数的值)时尤其有用。
结果,本发明对每一轴采用多个重载(overload)(例如,Descendants(后代)和SelfAndDescendants(自己和后代))。为了对讨论提供上下文,以下是XElement类上的所有轴的示例性列表。可以理解,该列表不旨在按任何方式进行限制。而且,可以理解,根据本发明对于其他节点存在其他轴函数,且这些轴函数应被包括在本公开及所附权利要求书的范围内。
public XContainer Parent {}
该函数返回节点的父亲。这对XContainer进行操作,如前关于示例性对象模型108所述,所有XContainer均有孩子。
public IEnumerable<object>Content(){}
给定节点,用户可查询节点的父亲,并通过采用该函数来询问其内容,系统将呈现其所有孩子(例如,内容(例如,值))。本发明的一新颖特征在于,如果存在某些串内容和某些元素内容,则将返回该混合内容。
public IEnumerable<T>Content<T>()where T :class {}
以上是用户可查询某一类型的内容的示例性重载。
XElement Element(XName name)(}
该轴返回具有特定名字的元素。在操作中,它可返回具有指定名字的第一个元素。
以下五个轴具有Ienumerable的返回类型。
IEnumerable<XElement>Elements(){}
该轴实现直接包含在指定元素内的所有孩子元素的呈现。
IEnumerable<XElement>Elements(XName name){}
类似地,该轴仅呈现某一名字的元素。而且,以下三个轴是上述功能的变型。
static IEnumerable<T>Elements<T>(this IEnumerable<XElement>source)
where T:class{}
static IEnumerable<XElement>Elements(this IEnumerable<XElement>
source){}
static IEnumerable<XElement>Elements(this IEnumerable<XElement>
source,XName name){}
XAttribute Attribute(XName name){}
该轴返回具有指定名字的属性。
再一次,如上关于XElement所述,XAttribute也可被重载到集合上。以下是根据本发明的重载的示例性方面。
IEnumerable<XAttribute>Attributes(){}
IEnumerable<XAttribute>Attributes(XName name){}
static IEnumerable<XAttribute>Attributes(this
IEnumerable<XElement>source){}
static IEnumerable<XAttribute>Attributes(this
IEnumerable<XElement>source,XName name){}
IEnumerable<XElement>Descendants(){}
该函数呈现孩子的孩子以及这些孩子的孩子的孩子等。实际上,该轴函数递归地返回节点的所有孩子。
IEnumerable<T>Descendants<T>()where T:class{}
这可过滤出某一类型的后代。
其他轴示例包括以下。
IEnumerable<XElement>Descendants(XName name){}
static IEnumerable<T>Descendants<T>(this IEnumerable<XElement>
source)where T:class{}
static IEnumerable<XElement>Descendants(this
IEnumerable<XElement>source){}
static IEnumerable<XElement>Descendants(this
IEnumerable<XElement>source,XName name){}
IEnumerable<XElement>SelfAndDescendants(){}
IEnumerable<T>SelfAndDescendants<T>()where T :class {}
IEnumerable<XElement>SelfAndDescendants(XName name){}
static IEnumerable<T>SelfAndDescendants<T>(this
IEnumerable<XElement>source)where T:class{}
static IEnumerable<XElement>SelfAndDescendants(this
IEnumerable<XElement>source){}
static IEnumerable<XElement>SelfAndDescendants(this
IEnumerable<XElement>source,XName name){}
IEnumerable<XElement>Ancestors(){}
IEnumerable<XElement>Ancestors(XName name){}
static IEnumerable<XElement>Ancestors(this IEnumerable<XElement>
source){}
static IEhumerable<XElement>Ancestors(this IEnumerable<XElement>
source,XName name){}
IEnumerable<XElement>selfAndAncestors(){}
IEnumerable<XElement>SelfAndAncestors(XName name){}
static IEnumerable<XElement>SelfAndAncestors(this
IEnumerable<XElement>source){}
static IEnumerable<XElement>SelfAndAncestors(this
IEnumerable<XElement>source,XName name){}
如所示,以上是根据本发明的示例性轴。可以理解,这些轴可对于单个集合采用,且可返回集合。
可以理解,本发明允许Element(元素)和Attribute(属性)之间的对称。例如,如以上标记(signature)中所示,元素和属性以相同方式来选择而代替如传统API中使用方法(例如,Attributes(“foo”))和索引器[“bar”](例如方括号)。然而,根据此处所述的API 202,用户可用相同方式访问元素和/或属性两者。换言之,仅有的区别在于利用了不同的轴且同时维护了所采用的方法的对称性。
在操作中,用户可查询(例如,经由导航组件206)元素,反过来系统可返回元素的集合。随后,各方面允许用户查询所返回的元素集合的所有属性。可以理解,该新颖的功能允许用户将关于集合的轴串起来。
可以理解,在查询XML时,查询可返回节点的集合(或集合的子集)。传统上,所呈现的节点集合的顺序用文档顺序维护。例如,如果在查询结果中一个节点比另一个先到,则说明在文档本身中该节点比后续结果节点先到。该节点将在下一节点之前遇到。换言之,作为查询结果返回节点的顺序与原始文档本身的顺序相同。
某些查询(例如,后代查询)会打乱文档顺序。例如,在XQuery品牌环境中,语义便于在每个查询之后将结果自动排序成文档顺序。如可以理解的,按文档顺序排序是非常昂贵的。本API 202的各方面不会自动按文档顺序排序从而查询可被适配。而且,导航组件206可包括便于按需按文档顺序显式排序的排序组件404。
与将该排序功能构建到语义中相反,各方面便于某些查询打乱文档顺序,之后允许按需显式排序。各方面不维护文档顺序是本发明的一新颖的特征。另外,文档顺序可经由显式排序(例如,排序组件404)来实现。可以理解,将信息编码到节点内的各种方法和机制便于按文档顺序的高效排序。这些方法和机制可由本领域的技术人员理解,且被认为落在本说明书和所附权利要求书的范围内。
如前所述,本API 202不考虑文本节点和/或属性集合的特定身份。诸如标准DOM的常规系统以比本说明书中所述的本发明所展示的数据模型更精细的粒度来展示标识信息项目的XML信息集(infoset)数据模型。结果,本发明的数据模型可允许更高效的实现,尤其是对于工作集。
例如,本革新的各方面采用普通(ordinary)的串而非文本节点。另外,相邻串被自动合并,从而增加效率。换言之,与传统DOM中不同地,本发明不展示单独的AttributeCollection(属性集合)。相反,根据本发明的各方面,每一元素直接维护属性的(循环)链接表。
因为常规系统具有非常详细的对象模型,它们可区分众多不同的节点。另外,每一节点具有个别的命名空间集合。
另外,在常规系统中,属性集合具有身份。换言之,节点的属性集合自己本身有可被区分的东西。它们也可区分文本节点。因此,在混合内容中,各文本片段本身是分开的节点。相反,根据本发明,混合内容中的文本片段仅是正常的串。它们不是具有特定身份并附加诸如父亲指针和命名空间节点的性质的特殊文本节点。
本发明采用比传统系统更粗略的信息视图,从而区分节点的较少性质。与需要在节点之间区分的以往系统不同,本发明不必区分文本节点。从而,可以理解,与常规系统相比,本系统可具有更小的存储器占用大小和更高效的实现。
所有的元素和属性都有名字。特别地,在XML中,在开括号之后有一个名字。从而,常规上,如果用户想要在文档内搜索,则必须准备好元素和/或属性的名字。例如,用户可查询来获取特定文档的所有作者。这将返回该文档中的所有作者元素。可以理解,将元素名或属性名作为串来比较尤其低效和昂贵。这是非常昂贵的,因为当比较串时,有必要遍历所有串字符,直到定位了一个不同的字符。
如果名字较长,这可能尤其昂贵,因为区别可能位于串的末尾。当对此考虑时,代替将名字作为串来存储,此处所述的API 202可将串存储为被称为XName的类型。可以理解,这通常被称为串散列。通过对所述API 202采用该散列技术,比较指针而非串。因此,每当创建新元素名时,系统可存储(例如,高速缓存)串并将指针返回到新的XName。从而,如果两个名字由同一XName表示,则它们使用同一指针。
问题在于命名空间组件406内的表可能会增长。本发明的各方面可监控增长(例如,速率、大小)和/或基于任何定义的准则来清除名字表。在以下示例中示出“ClearNameCache(清除名高速缓存)”。从而,当系统再次比较时,将发现该名字不再存在,从而将重新插入该名字。这种监控和清除功能给出了对对应于命名空间406的名字表的显式控制。另外,系统可监控增长和相应的统计数据,从而当表增长过快时等生成事件。
XML中的名字可由两部分组成,如元素(例如,书、作者)的本地名和命名空间前缀。这两部分命名约定尤其有用,因为可能存在在同一文档中具有冲突的名字的多个元素。从而,API 202的各方面可将这些名字置入命名空间406,通过将其与前缀组合来具有唯一的串。
因此,API 202可通过包含命名空间前缀并追加本地名来表示这些完全合格或通用名字。每个名字可由命名空间URI和本地名来组成。
API 202采用新颖的系统和/或方法来应用XML名和命名空间。如前所述,在一个示例中,XName类可表示由本地元素或属性名“part”和命名空间URI“http://www.cars.com/xml”组成的“{http://www.cars.com/xml}part”形式的通用或扩展名。
XName类可允许通过输入串并比较对象引用来进行高效的XML名比较。通过提供串到XName的隐式转换,用户不需要显式构造XName。
pudlic sealed class XName
{
public string ExpandedName {}
public string LocalName {}
public string NamespaceName {}
public override int GetHashCode(){}
public override bool Equals(object obj){}
public override string ToString(){}
public static void ClearNameCache(){}
public static XName Get(string expandedName){}
public static XName Get(string localName,string
namespaceName){}
public static implicit operator XName(string s){}
public static bool operator ==(XName n1,XName n2){}
public static bool operator !=(XName n1,XName n2){}
}
如上所示,XName类输入这些串。从而,这些名字不作为串进行比较,因为它们经由XName引用来比较。由于本API 202提供了来自串的隐式操作符,用户不必显式创建该XName。
图5示出了根据本发明的一方面用于导航标记语言(例如,XML)节点的结构的方法的过程流程图。尽管为说明简单起见,此处例如以流程图形式示出的一个或多个方法被示出或描述为一连串动作,但是可以理解和领会,本发明不受动作顺序的限制,根据本发明,某些动作可按照不同顺序进行和/与此处所示和所述的其他动作并发。例如,本领域的技术人员可以理解和领会,方法可替换地被表示为诸如状态图中的一连串相互关联的状态或事件。而且,不是所有示出的动作都是实现根据本发明的方法所必需的。
在502,接收到导航表达式。如上所述,导航表达式可以是标识集合内所需目标(例如,值)的轴语句。例如,导航表达式可请求特定节点的父亲。
在504可分析导航表达式(例如,轴)。在不同的示例中,导航表达式可请求特定节点的父亲、祖父亲、兄弟等。从而,在506可标识上下文节点。该上下文节点可定义导航表达式的起始点。此外,在508处可确定导航的方向。
在510处可标识满足导航表达式的节点。在512,可作出是否有其他节点存在的判断。如果结构(例如,树)中有其他节点存在,则该过程返回至510,从而标识其他节点。如果没有其他节点存在,则到达停止框。
现在参考图6,示出了根据本发明的另一方面的系统600。更具体地,图6示出了便于构造XML上下文无关片段、节点或节点的集合的系统600。传统上,XMLAPI在结构上是命令性的。换言之,XML节点是经由结构化且特定序列的命令构造的。作为示例,命令性的命令序列以定义节点开始,并以添加一个孩子、另一个孩子等来继续。
本API组件202可采用接受命令(例如,表达式)的接收组件212。构造组件208与对象模型108一起可将表达式转换成XML片段或集合204。
图7示出了系统600的替换框图。如图所示,构造组件208可接收面向表达式语言组件702。从而,根据对象模型组件108,可采用构造组件208来将面向表达式语言组件702转换成节点的标记语言集合704。如图所示,标记语言集合704可包括1到P个上下文无关节点组件,其中P是整数。可以理解,1到P个上下文无关节点组件可被个别或统称为上下文无关节点组件706。
为了便于用于查询,本发明采用面向表达式的机制(例如,面向表达式语言组件702)来构造XML节点(例如,构造组件208)。代替采用命令性语句来生成XML集合,本发明利用创建节点的新颖的面向表达式方法。如可以理解的,在常规系统和方法中,XML节点是以文档为中心的。换言之,常规XML节点仅生存在文档的上下文中。这些传统节点不能独立生存。与之相反,本API 202生成可独立于文档生存的上下文无关节点。
上下文无关节点组件706的一个新颖的特征在于,这些上下文无关节点组件706可被自主创建且被用作其他节点的孩子。因此,与常规系统相反并根据本API202,上下文无关节点组件706本身不必活在文档的上下文中。
在操作中,当节点被创建时,它没有父亲。所创建的节点不作为任何其他节点的孩子来生存,因为它是新建的。本发明的一新颖的特征在于当节点被指定为另一节点的孩子时,或者如果存在返回要被作为孩子而包括的节点的查询时,构造组件208可在该节点已经具有父亲时对其克隆。可以理解,这些节点仅可具有一个父亲。从而,如果不同的节点被选作一节点的父亲,则该节点可被自动克隆,从而允许该父子关系。相反,常规的API要求用户显式地克隆节点。
系统600的构造组件208可自动检查来确定对一节点是否存在父亲。如果是,则构造组件208可自动克隆并指定新父亲即克隆节点的父亲。克隆的结果是新颖的上下文无关节点构造。
当有父亲的节点用于构造新节点时,它们可被自动克隆来维护新构造节点的结构。然而,节点不必有父亲,且特别地,节点可独立于文档存在。提供以下示例来向本发明添加上下文,从而该示例不旨在以任何方式限制本公开。
class Test
{
public static void Main()
{
XElement a=new XElement(″A″);<==a没有父亲节点
XElement b1=new XElement(″B″,a);<==a没有得到克隆
XElement b2=new XElement(″B″,a);<==a要得到克隆
a.Add(new XElement(″C″));<==只有b1得到修改
Console.WriteLine(″---------------″);
Console.WriteLine(b1);
Console.WriteLine(″---------------″);
Console.WriteLine(b2);
Console.WriteLine(″---------------″);
}
}
以上示例呈现以下结构:
---------------
<B>
<A>
<C />
</A>
</B>
---------------
<B>
<A/>
</B>
---------------
以下是对根据API 202的一方面最终可创建的XML片段的讨论。如前示例所示,XML片段和文档用功能或基于表达式的方式来代替经由语句序列的命令性方式构造。例如,可利用以下示出的面向表达式方式来创建以下分层XML元素。
<bib>
<books>
<book year=″1999″>
<title>TCP/IP Illustrated</title>
<author>
<last>Stevens</last>
<first>W.</first>
</author>
<publisher>Addison-Wesley</publisher>
<price>65.95</price
</book>
</books>
</bib>
使用本发明的API 202以及相应的子组件(例如,构造组件208、对象模型108)可创建以上XML片段。在操作中,可编写与得到的元素的结构同构的单个嵌套的表达式。例如:
XElement bib=
new XElement(″bib″,
new XElement(″books″,
new XElement(″book″,
new XAttribute(″year″,″1999″),
new XElement(″title″,″TCP/IP Illustrated″),
new XElement(″author″,
new XElement(″last″,″Stevens″),
new XElement(″first″,″W.″)
),
new XElement(″publisher″,″Addison-Wesley″),
new XElement(″price″,65.95)
)
)
);
使用常规API创建以上XML片段过于麻烦。使用现有的API,诸如常规XMLDOM,用户首先需要构建容器文档。接着,在该文档的上下文中必须命令性地创建元素和属性。另外,用户必须命令性地将这些节点分配为其他节点的孩子。以下是该过程根据常规API的示例。
XmlDocument doc=new XmlDocument();
XmlElement bib=doc.CreateElement(″bib″);
XmlElement book=doc.CreateElement();
books.Name=″books″;
bib.appendChild(books);
XmlElement book=doc.CreateElement(″book″);
books.appendChild(book);
XmlAttribute year=doc.CreateAttribute();
year.value=″1999″
book.SetAttributeNode(year);
XmlElement title=doc.CreateElement(″title″);
title.InnerText=″TCP/IP Illustrated″;
book.appendChild(title);
XmlElement author=doc.CreateElement(″author″);
book.appendChild(author);
XmlElement lastName=doc.CreateElement(″last″);
lastName.InnerText=″Steven″;
author.appendChild(lastName);
XmlElement firstName=doc.CreateElement(″first″);
firstName.InnerText=″W.″;
author.appendChild(firstName);
XmlElement publisher=doc.CreateElement(″publisher);
publisher.InnerText =″Addison-Wesley″;
book.appendChild(publisher);
XmlElement price =doc.CreateElement(″price″);
price.InnerText=″65.95″;
book.appendChild(price);
doc.DocumentElement.InsertBefore(bib,
doc.DocumentElement.LastChild);
可以理解,该常规方法不能够在查询中使用,因为当用户想要返回新的XML片段作为查询的结果时,它并不总是在特定文档的上下文中。另一方面,创建上下文无关结构(如根据本API 202所述)的能力便于对XML片段直接查询。API 202用于查询的各方面依赖于用户可将原文(original)创作为表达式的事实。
图8示出了将面向表达式语句转换成XML片段的方法。在802,接收面向表达式语句。例如,可采用接收组件来从构造组件接受面向表达式语句。在804,所接收的语句可被转换。如参考图7所述,可采用构造组件来转换语句。在806,可作出所创建的节点是否有父亲的判断。如果否,则在808可从经转换的表达式生成XML片段。
如果在806确定要创建的节点有父亲,则在810该节点可被克隆。从而,在812可分配父亲。可以理解,可为所创建的每一节点采用图8的方法。
现在参考图9,示出了根据本发明的一方面便于修改节点的系统900。一般,系统900可包括便于与标记语言集合204接口的API组件202。可以理解,标记语言集合204可包括具有上下文无关和/或以文档为中心节点的多个XML节点。
API组件202可包括具有操作符组件902的修改组件210。操作符组件902可便于操纵节点本身、其父亲、其孩子等。以下是更新(例如,操纵)节点的父亲的示例性语句列表。而且,之后包括更新当前节点本身的示例。
对父亲更新:
void AddAfterThis(object content){}
该语句向节点添加新的兄弟。更具体地,该语句便于在父亲节点中该节点之后添加所指定的节点。
其他示例如下:
void AddAfterThis(params object[]content){}
void AddBeforeThis(object content){}
void AddBeforeThis(params object[]content){}
void Remove(){}-你可以将你自己从父亲容器中移除
更新自身:
void Add(object content){}-该语句添加在结尾。
void Add(params object[]content){}-该语句添加在结尾。
void AddFirst(object content){}-该语句添加在开头。
void AddFirst(params object[]content){}-该语句添加在开头。
void RemoveContent(){}
void ReplaceContent(object content){}
void ReplaceContent(params object[]content){}
void RemoveAll(){}
void RemoveAttributes(){}
void setAttribute(XName name,object value){}
void setElement(XName name,object value){}
除构造组件208的功能以外,修改组件210结合操作符组件902允许用户执行原地更新。换言之,修改组件210允许对文档进行除功能构造以外的命令性修改。
现在参考图10,示出了用于将应用程序接口至标记语言组件(例如,XML)的计算机的框图。为了向本发明的各方面提供附加的上下文,图10及以下讨论旨在提供对可在其中实现本发明各方面的合适的计算环境1000的简要、一般的描述。尽管以上在可以在一台或多台计算机上运行的计算机可执行指令的通用上下文中描述了本发明,但是本领域的技术人员可以认识到,本发明也可以结合其它程序模块和/或作为软硬件的组合来实现。
一般而言,程序模块包括例程、程序、组件、数据结构等,它们执行特定的任务或实现特定的抽象数据类型。而且,本领域的技术人员可以理解,本发明方法可以使用其它计算机系统配置来实现,包括单处理器或多处理器计算机系统、小型机、大型机、以及个人计算机、手持式计算设备、基于微处理器的或可编程消费电子产品等,它们中的每一个都可以有效地耦合至一个或多个相关联的设备。
本发明所示方面也可以在分布式计算环境中实现,在分布式计算环境中某些任务是由通过通信网络链接的远程处理设备执行的。在分布式计算环境中,程序模块可以位于本地或远程存储器存储设备中。
计算机一般包括各种计算机可读介质。计算机可读介质可以是可由计算机访问的任何可用介质,且包括易失性和非易失性介质、可移动和不可移动介质。作为示例,而非限制,计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以任何方法或技术实现的用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁带盒、磁带、磁盘存储或其它磁性存储设备、或能用于存储所需信息且可以由计算机访问的任何其它介质。
通信介质通常具体化为诸如载波或其它传输机制等已调制数据信号中的计算机可读指令、数据结构、程序模块或其它数据,且包含任何信息传递介质。术语“已调制数据信号”指的是这样一种信号,其一个或多个特征以在信号中编码信息的方式被设定或更改。作为示例,而非限制,通信介质包括有线介质,诸如有线网络或直接线连接,以及无线介质,诸如声学、RF、红外线和其它无线介质。上述中任一个的组合也应包括在计算机可读介质的范围之内。
再次参考图10,示出了用于实现本发明各方面的示例性环境1000包括计算机1002,计算机1002包括处理单元1004、系统存储器1006和系统总线1008。系统总线1008将包括但不限于系统存储器1006在内的系统组件耦合至处理单元1004。处理单元1004可以是各种市场上可购买的任何处理器。双微处理器和其它多处理器体系结构也可以作为处理单元1004使用。
系统总线1008可以是若干类型总线结构中的任一种,可进一步与存储器总线(带有或不带有存储器控制器)、外围总线和使用各种市场上可购买的总线体系结构中任一种的局部总线互连。系统存储器1006包括只读存储器(ROM)1010和随机存取存储器(RAM)1012。基本输入/输出系统(BIOS)存储在诸如ROM、EPROM、EEPROM等非易失性存储器1010中,其中BIOS包含有助于诸如启动时在计算机1002中元件之间传递信息的基本例程。RAM 1012还可以包括用于高速缓存数据的诸如静态RAM的高速RAM。
计算机1002还包括内部硬盘驱动器(HDD)1014(例如EIDE、SATA),其中内部硬盘驱动器1014也可被配置为在合适的机箱(未示出)中供外部使用;磁软盘驱动器(FDD)1016(例如读写可移动盘1018)以及光盘驱动器1020(例如读CD-ROM盘1022,或者读写诸如DVD的其它高容量光介质)。硬盘驱动器1014、磁盘驱动器1016和光盘驱动器1020可以分别通过硬盘驱动器接口1024、磁盘驱动器接口1026和光盘驱动器接口1028连接到系统总线1008。用于外部驱动器实现的接口1024包括通用串行总线(USB)和IEEE 1394接口技术中的至少一个或两者。其他外部驱动器连接技术也落在本发明的构想之内。
驱动器及其相关联的计算机可读介质提供数据、数据结构、计算机可执行指令等的非易失性存储。对于计算机1002,驱动器和介质容纳合适数字格式的任何数据的存储。尽管以上计算机可读介质的描述指的是HDD、可移动磁盘和诸如CD或DVD的可移动光介质,但本领域的技术人员应该理解,计算机可读的其它类型的介质,诸如zip驱动器、磁带盒、闪存卡、盒式磁带等,也可以在示例性操作环境中使用,而且,任何这样的介质可以包含用于执行本发明的方法的计算机可执行指令。
多个程序模块可存储在驱动器和RAM 1012中,包括操作系统1030、一个或多个应用程序1032、其它程序模块1034和程序数据1036。操作系统、应用程序、模块和/或数据的全部或部分也可以高速缓存在RAM 1012中。可以理解,本发明可以使用各种市场上可购买的操作系统或操作系统的组合来实现。
用户可以通过一个或多个有线/无线输入设备,例如键盘1038和诸如鼠标1040的定点设备来向计算机1002输入命令和信息。其它输入设备(未示出)可包括麦克风、IR遥控器、操纵杆、游戏手柄、指示笔、触摸屏等。这些和其它输入设备通常通过耦合至系统总线1008的输入设备接口1042连接到处理单元1004,但可以由其它接口连接,诸如并行端口、IEEE 1394串行端口、游戏端口、USB端口、IR接口等。
监示器1044或其它类型的显示设备也通过接口,诸如视频适配器1046连接至系统总线1008。除监示器1044之外,计算机一般包括其它外围输出设备(未示出),诸如扬声器、打印机等。
计算机1002可使用通过有线和/或无线通信至一台或多台远程计算机,诸如远程计算机1048的逻辑连接在网络化环境中操作。远程计算机1048可以是工作站、服务器计算机、路由器、个人计算机、便携式计算机、基于微处理器的娱乐设备、对等设备或其它常见的网络节点,并且一般包括相对于计算机1002描述的多个或全部元素,但是为了简明起见,仅示出了存储器/存储设备1050。所示逻辑连接包括至局域网(LAN)1052和/或较大网络,例如广域网(WAN)1054的有线/无线连接。这样的LAN和WAN网络环境在办公室和公司中是常见的,且促进诸如内联网的企业范围网络,它们全部都可连接至例如因特网的全球通信网络。
当在LAN网络环境中使用时,计算机1002通过有线和/或无线通信网络接口或适配器1056连接至局域网1052。适配器1056可促进至LAN 1052的有线或无线通信,LAN 1025也可包括部署在其上的用于与无线适配器1056通信的无线接入点。
当在WAN网络环境中使用时,计算机1002可以包括调制解调器1058,或者连接至WAN 1054上的通信服务器,或者具有用于通过诸如因特网等WAN 1054建立通信的其它装置。调制解调器1058可以是内置或外置的和有线或无线设备,它通过串行端口接口1042连接至系统总线1008。在网络化环境中,相对于计算机1002所述的程序模块或其部分可以存储在远程存储器/存储设备1050中。可以理解,所示的网络连接是示例性的,且可使用在计算机之间建立通信链路的其它手段。
计算机1002可以用于与操作上部署在无线通信中的任何无线设备或实体通信,例如,打印机、扫描仪、台式和/或便携式计算机、便携式数据助理、通信卫星、与无线可检测标签(例如公共电话亭、报亭、休息室)相关联的任何设备或位置、以及电话。这至少包括Wi-Fi和BluetoothTM(蓝牙)无线技术。因此,通信可以是使用常规网络的预先定义的结构,或仅仅是至少两个设备之间的自组织通信。
Wi-Fi即无线保真允许从家里的睡椅、旅馆房间中的床或工作单位的会议室无线地连接至因特网。Wi-Fi是类似于蜂窝电话中使用的技术的无线技术,它使得例如计算机等设备能够在室内外基站范围内的任何地方收发数据。Wi-Fi网络使用称为IEEE 802.11(a、b、g等)的无线电技术来提供安全、可靠、快速的无线连接。Wi-Fi网络可以用于将计算机彼此连接、连接至因特网、以及连接至有线网络(使用IEEE 802.3或以太网)。Wi-Fi网络在非特许的2.4和5GHz无线电波段中,例如以11Mbps(802.11a)或54Mbps(802.11b)数据速率运行,或者使用包括两种波段(双波段)的产品,因此网络可以提供类似于在许多办公室中使用的基本10BaseT有线以太网网络的真实世界性能。
现在参考图11,示出了根据本API一方面的示例性计算环境1100的示意框图。系统1100包括一个或多个客户机1102。客户机1102可以是硬件和/或软件(例如,线程、进程、计算设备)。客户机1102可以例如通过使用本发明来容纳cookie和/或相关联的上下文信息。
系统1100也包括一个或多个服务器1104。服务器1104也可以是硬件和/或软件(例如,线程、进程、计算设备)。服务器1104可以例如通过使用本发明容纳执行变换的线程。客户机1102与服务器1104之间的一种可能的通信可以是以适于在两个或多个计算机进程之间传输的数据包的形式。数据包可以包括,例如cookie和/或相关联的上下文信息。系统1100包括通信架构1106(例如,诸如因特网等全球通信网络),它可以用于促进客户机1102与服务器1104之间的通信。
可以通过有线(包括光纤)和/或无线技术来促进通信。客户机1102操作上连接至可以用于存储对客户机1102本地的信息(例如,cookie和/或相关联的上下文信息)的一个或多个客户机数据存储1108。类似地,服务器1104操作上连接至可使用来存储对服务器1104本地的信息的一个或多个服务器数据存储1110。
以上描述包括本发明的示例。当然,不可能为描述本发明而描述每个可想象的组件或方法的组合,但是本领域的普通技术人员可以认识到,还可能有本发明的众多其它组合和排列。从而,本发明旨在包括落入所附权利要求书精神和范围内的所有这样的变更、修改和变化。而且,就或者在详细描述中或者在权利要求书中使用的术语“包括”而言,当被用作权利要求书中的过渡词时,这样的术语旨在是包含性的,类似于解释术语“包含”的方式。