九州ju111net手机登录-手机版官网
Atitit xml命名空间机制

Atitit xml命名空间机制

作者:宗教    来源:未知    发布时间:2019-12-20 14:35    浏览量:

 

 昨天需要操作用代码操作csproj文件,实现不同vs版本的切换。

先放下将要进行说明的例子:
data.xml

 

在用XElement读取了csproj文件以后怎么也获取不到想要的对象。

 

Atitit xml命名空间机制

反反复复试验了好多次都不得要领:先看下csproj文件的内容:

<?xml version="1.0"?>
<root xmlns="www.ljzforever.com"
   xmlns:xsi=""
   xsi:schemaLocation="www.ljzforever.com xsd.xsd">
 <emp>
  <id>1</id>
  <name>ljz1</name>
 </emp>
 <emp>
  <id>2</id>
  <name>ljz2</name>
 </emp>
 <emp>
  <id>3</id>
  <name>ljz3</name>
 </emp>
 <emp>
  <id>4</id>
  <name>ljz4</name>
 </emp>
</root>

 

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)$(MSBuildToolsVersion)Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{EC9D3364-405E-4931-8148-779183C72A40}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>AsyncDemo</RootNamespace>
    <AssemblyName>AsyncDemo</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>binDebug</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>

</Project>

 

命名冲突1

因为只是为了说明问题,我只截取了一部分csproj文件

xsd.xsd

使用前缀来避免命名冲突2

我最初的代码是:

 

使用命名空间(Namespaces)2

XDocument doc = XDocument.Load(@"D:DemoAsyncDemoAsyncDemoAsyncDemo.csproj");
XElement x = doc.Element("Project");

<?xml version="1.0"?>
<schema xmlns=""
  targetNamespace="www.ljzforever.com"
  elementFormDefault="qualified">
 <element name="root">
  <complexType>
   <sequence>
    <element name="emp" maxOccurs="unbounded">
     <complexType>
      <sequence>
       <element name="id" type="int" />
       <element name="name" type="string" />
      </sequence>
     </complexType>
    </element>
   </sequence>
  </complexType>
 </element>
</schema>

XML Namespace (xmlns) 属性2

这个x始终为空,最后分析了下doc对象

 

默认的命名空间(Default Namespaces)2

图片 1

先讲schema

命名空间的语法如下   xmlns:[prefix]=”[url of name]”3

果然找到了玄机,这个name并不是一个单纯“project”,还带有命名空间。

xmlns=""

 

那么如何获得这个带有Namespace的节点名哪?

其实还有另一种写法

 

好吧,让我们回过头来看看XElement的构造函数:

<xs:schema xmlns:xs=
我在这里倫了个懒,把它作为了默认的命名空间,如果按照下面的一种写法,就需要在每个schema标签前都加上xs:
这是固定语法

XML 命名空间提供避免元素命名冲突的方法。

public XElement(XName name);
注意哦,参数的类型是XName,而不是string,那么平时为什么能用string哪?XName定义了一个隐式的转换,可以把string隐式的转换成XName。

 

命名冲突

在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。

这个 XML 文档携带着某个表格中的信息:

<table>

   <tr>

   <td>Apples</td>

   <td>Bananas</td>

   </tr></table>

这个 XML 文档携带有关桌子的信息(一件家具):

<table>

   <name>African Coffee Table</name>

   <width>80</width>

   <length>120</length></table>

假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的 <table> 元素,就会发生命名冲突。

XML 解析器无法确定如何处理这类冲突。

所以,关于Namespace自然也要从XNamespace入手,然后找一个能够变成XName的方法,察看XNamespace的定义,就可以看到:

 targetNamespace="www.ljzforever.com"

使用前缀来避免命名冲突

此文档带有某个表格中的信息:

<h:table>

   <h:tr>

   <h:td>Apples</h:td>

   <h:td>Bananas</h:td>

   </h:tr></h:table>

现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的 <table> 元素 (<h:table> 和 <f:table>)。

通过使用前缀,我们创建了两种不同类型的 <table> 元素。

public static XName operator +(XNamespace ns, string localName);
只要把XNamespace加上本地名称(string),就是一个XName了,非常简单。

表示在schema所定义的标签应作用于哪一个命名空间下。应用此schema的xml文件中如果有部分或全部标签想受此schema的控制,标签前必须使用此命名空间。

使用命名空间(Namespaces)

这个 XML 文档携带着某个表格中的信息:

与仅仅使用前缀不同,我们为 <table> 标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。

 

 

再看看如何创建一个XNamespace:

里面的www.ljzforever.com其实可以随便写,写abc都行

XML Namespace (xmlns) 属性

XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:

xmlns:namespace-prefix="namespaceURI"

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

 

 

public static implicit operator XNamespace(string namespaceName);
又是隐式转换。。。来看看具体如何创建一个带namespace的project吧:

 

默认的命名空间(Default Namespaces)

为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。

请使用下面的语法:

xmlns="namespaceURI"

这个 XML 文档携带着某个表格中的信息:

<table xmlns=";

   <tr>

   <td>Apples</td>

   <td>Bananas</td>

   </tr>

</table>

 static void TestXml()
        {
            XDocument doc = XDocument.Load(@"D:DemoAsyncDemoAsyncDemoAsyncDemo.csproj");
            XNamespace v = "http://schemas.microsoft.com/developer/msbuild/2003";
            XElement x = doc.Element(v + "Project");
        }

elementFormDefault="qualified"

命名空间的语法如下   xmlns:[prefix]=”[url of name]”

其中“xmlns:”是必须的属性。“prefix”是命名空间的别名,它的值不能为xml。

 <sample xmlns:ins=”;

 

 

 

作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher

捕鸟王"Bird Catcher 王中之王King of Kings 虔诚者Pious 宗教信仰捍卫者 Defender of the Faith. 卡拉卡拉红斗篷 Caracalla red cloak

简称:: Emir Attilax Akbar 埃米尔 阿提拉克斯 阿克巴

全名::Emir Attilax Akbar bin Mahmud bin  attila bin Solomon bin adam Al Rapanui 

埃米尔 阿提拉克斯 阿克巴 本 马哈茂德 本 阿提拉 本 所罗门 本亚当 阿尔 拉帕努伊   

常用名:艾提拉(艾龙),   EMAIL:1466519819@qq.com

头衔:uke总部o2o负责人,全球网格化项目创始人,uke宗教与文化融合事务部部长,Uke部落首席大酋长,uke制度与重大会议委员会委员长,uke保安部首席大队长,uke制度检查委员会副会长,奶牛科技cto ,uke波利尼西亚区大区连锁负责人,克尔格伦群岛区连锁负责人,莱恩群岛区连锁负责人,uke汤加王国区域负责人。布维岛和南乔治亚和南桑威奇群岛大区连锁负责人

 

转载请注明来源:attilax的专栏   

--Atiend

 

 

 

 定义一个namespace,在使用时直接+string即可。这样就可以得到我们想要的对象了,具体操作代码如下:

有两个值:qualified和unqualified

 static void TestXml()
        {
            string path = @"D:DemoAsyncDemoAsyncDemoAsyncDemo.csproj";
            XDocument doc = XDocument.Load(path);
            XNamespace v = "http://schemas.microsoft.com/developer/msbuild/2003";
            var x = doc.Element(v + "Project").Elements(v+"PropertyGroup");
            foreach (var e in x)
            {
                XElement element = e.Element(v + "AssemblyName");
                if(element!=null)
                {
                    element.SetValue("abcd");
                }
            }
            doc.Save(path);
        }

首先要知道:运用了schema中声明的元素或者类型的Xml标签只能归到两个命名空间中的某一个去,这两个是,无名命名空间和由targetSchema属性指明的目标命名空间。

这里面所有需要操作的节点都要采用命名空间加节点名的方式。

如果该值是 unqualified,实例xml的根元素必须有命名空间的的限定,这个命名空间必须是schema中定义的targetNameSpace。但是其下子元素无须也不允许用命名空间前缀限定目标命名空间。 子元素的命名空间为空命名空间。

希望对您有所帮助……

如果该值是 qualified,实例xml根元素及其下所有子元素都必须通过命名空间前缀限定目标命名空间。这个命名空间必须是schema中定义的targetNameSpace。

 

说的很拗口啊,我来解释一下,这个属性与targetNameSpace相关

前面不是说了一个schema只对特定命名空间下的标签起作用,

如果是qualified,则使用此schema的xml的每个标签必须使用此命名空间,因为我在前面使用的默认的命名空间,所以不需要在每个标签的前面加上命名空间前缀

如果是unqualified,则是只能在根标签上使用此命名空间,且子标签不能使用此命名空间,使用别的命名空间是可以的。但是起不到验证作用。

我不太明白为什么要弄个起不到验证作用的unqualified参数,反正我用的一般都是qualified

 

下面再来谈谈xml文件的

xmlns="www.ljzforever.com"

里面的值必须和targetNameSpace内定义的一样,我是倫了个懒,写成了默认的命名空间,如果写成一般的,则需要在所有子标签前加上命名空间前缀

 

xmlns:xsi=""
固定写法,没什么好说的

 

 xsi:schemaLocation="www.ljzforever.com xsd.xsd">
固定写法,值由两部分组成,空格前面是与targetNameSpace内定义的一样,后面是xsd文件路径,因为我把它们放在了同一目录下,所以没有写很多路径

 

 

讲了这么多,其实你一定觉得这个命名空间很麻烦,其实xml也提供了无命名空间的解决方案:

 

data.xml

 

<?xml version="1.0"?>
<root xmlns:xsi="" xsi:noNamespaceSchemaLocation="xsd.xsd">
 <emp>
  <id>1a</id>
  <name>ljz1</name>
 </emp>
</root>

 

xsd.xsd

 

<?xml version="1.0"?>
<schema xmlns="" elementFormDefault="qualified">
 <element name="root">
  <complexType>
   <sequence>
    <element name="emp" minOccurs="1" maxOccurs="unbounded">
     <complexType>
      <sequence>
       <element name="id" type="int" />
       <element name="name" type="string" />
      </sequence>
     </complexType>
    </element>
   </sequence>
  </complexType>
 </element>
</schema>

 

只不过把xsi:schemaLocation改成xsi:noNamespaceSchemaLocation,而后面直接跟文件路径,而不用写命名空间!

如果采取这种方式,xml文件中可以采用任意命名空间,或者不用,但是要注意保持一致:要用就用一样的,要么就都不用!

 

以下是我所参考的文章:

Schema中elementFormDefault="qualified"所起的作用

XSD schema文件中elementFormDefault 属性探讨

XML Schema介绍之namespace

还有w3school的

上一篇:论语.先进9
友情链接: 网站地图
Copyright © 2015-2019 http://www.592dazhaxie.com. 九州ju111net手机登录有限公司 版权所有