当前位置: 首页 > 编程语言 > C#

如何在不使用所有子节点中的XNamespace的情况下为子节点创建具有默认命名空间的XElement分享

时间:2023-04-11 11:52:19 C#

C#学习教程:如何在不在所有子节点中使用XNamespace的情况下为子节点创建具有默认命名空间的XElementNamespacedXElement我正在尝试使用System.Xml.Linq创建XHTML文档。所以我树中的绝大多数节点都应该使用这个命名空间:http://www.w3.org/1999/xhtml我可以使用XNamespace轻松创建作用于这个命名空间的XElement节点,如下所示:XNamespacexhtml="http://www.w3.org/1999/xhtml";//...newXElement(xhtml+"html",//...但是,我不希望创建HTML节点的所有代码都提供了XNamespace,并且必须为每个单独的XElement(和XAttribute)添加前缀我创建的名称。XML文本格式本身考虑了这一点,并允许使用保留的xmlns属性空间在祖先中设置默认命名以进行后代继承。我想使用System.Xml.Linq做类似的事情。是否可以?我决定使用一个名为XHtml的静态类,如下所示:publicstaticclassXHtml{staticXHtml(){Namespace="http://www.w3.org/1999/xhtml";}publicstaticXNamespace命名空间{get;私有集;}publicstaticXElementElement(stringname){returnnewXElement(Namespace+name);}publicstaticXElementElement(stringname,paramsobject[]content){returnnewXElement(Namespace+name,content);}publicstaticXElementElement(stringname,objectcontent){returnnewXElement(Namespace+name,content);}publicstaticXAttributeAttribute(stringname,objectvalue){returnnewXAttribute(/*Namespace+*/name,value);}publicstaticXTextText(stringtext){returnnewXText(text);}publicstaticXElementA(stringurl,paramsobject[]content){XElementresult=Element("a",content);结果。添加(属性(“href”,url));返回结果;这似乎是最简洁的做事方式,尤其是当我可以添加方便的例程时,例如XHtml.A方法(此处并未显示我的所有类)。我使用递归重写路径。你真的不需要“重建”树。您只需换出节点名称(XName)。privatestaticvoidApplyNamespace(XElementparent,XNamespacenameSpace){if(DetermineIfNameSpaceShouldBeApplied(parent,nameSpace)){parent.Name=nameSpace+parent.Name.LocalName;}foreach(XElementchildinparent.Elements()){ApplyNamespace(child,nameSpace);}}问题是用于创建XElement的XName需要指定正确的名称空间。我想要做的是创建一个这样的静态类:-publicstaticclassXHtml{publicstaticreadonlyXNamespaceNamespace="http://www.w3.org/1999/xhtml";publicstaticXNameHtml{get{returnNamespace+"html";}}publicstaticXNameBody{get{returnNamespace+"body";}}//..其他元素类型}现在您可以像这样构建一个xhtml文档:-XDocumentdoc=newXDocument(newXElement(XHtml.Html,newXElement(XHtml.Body)));这个静态类的另一个方法是:–staticclassXHtml{publicstaticreadonlyXNamespaceNamespace="http://www.w3.org/1999/xhtml";publicstaticreadonlyXNameHtml=Namespace+"html";publicstaticreadonlyXNameBody=Namespace+"body";这样做的缺点是无论你是否使用它们都会实例化所有可能的XName,但优点是Namespace+"tagname"的转换只发生一次。我不确定这种转换是否会被优化掉。XNamesareonlyinstantiatedonce:-以上是C#学习教程:HowtocreateanXElementwithadefaultnamespaceforachildnodewithoutusingXNamespaceinallchildnodes分享全部内容如果对大家有用,需要了解更多C#学习教程,希望大家多多关注—XNamepacen="http://www.w3.org/1999/xhtml";XNamesx=n+"A";XNamey=n+"A";Object.ReferenceEquals(x,y)//为真。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢