XML标记中的句点

Avi*_*Avi 7 xml xaml

现在学习XAML,我一直看到Object.Attribute格式的XAML标签.例如:

 <Deployment.OutOfBrowserSettings>
     OutOfBrowserSettings ShortName="Hello World" >
Run Code Online (Sandbox Code Playgroud)

不要记得以前看过这样的XML属性,总是会看到简单的单词,或者可能是名称空间列前缀,例如x:application.因此,为了表达上面的对象/属性关系,我希望有一个符号,如:

<Deployment>
   <OutOfBrowserSettings ShortName="Hello World" >
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:'.'的意义是什么?XML标记内的表示法.什么是语义?它是否特定于XAML?

Rob*_*ney 11

为了扩大一点Alex的说法:

对于XML,元素名称中的句点没有意义. a,a.,a.b,和a.b.c都是合法的(也是唯一的)元素名称.

对于XAML,元素名称中的句点具有相当大的意义.讽刺的是,亚历克斯报价,从你的XML使用期字符警告你离开的建议,也正是为什么 XAML使用时期:使XamlReader所知道的,它看到的时候first.name,那name是对象的属性first.因此:

<ListBox>
  <ListBox.BorderThickness>2</ListBox.BorderThickness>
  <ListBox.BorderBrush>Yellow</ListBox.BorderBrush>
  <TextBox>foo</TextBox>
  <TextBox>bar</TextBox>
  <TextBox>baz</TextBox>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

为什么你不能这样做?

<ListBox>
   <BorderThickness>2</BorderThickness>
   ...
Run Code Online (Sandbox Code Playgroud)

有两个原因.第一个是简单的XML设计:XML元素可以包含多个具有相同名称的元素.将属性建模为子元素实际上是一个坏主意,因为那时你必须在模式中强制执行唯一性,或者当有多个具有相同名称的子元素时,有一个规则来处理对象的属性:

<ListBox>
   <BorderThickness>2</BorderThickness>
   <BorderThickness>3</BorderThickness>
   <BorderThickness>4</BorderThickness>
   ...
Run Code Online (Sandbox Code Playgroud)

这就是为什么XAML将属性建模为属性,XML要求是唯一的:

<ListBox BorderThickness='2' BorderBrush='Yellow'...
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,有一个与在XAML使用属性的问题:如果一个对象的属性必须按照特定的顺序来设置,你不应该使用属性来表示它们它发生XamlReader顺序读取的属性,他们出现在元素中,并按顺序将它们分配给属性.但是读取和写入XML的工具不能保证保留属性的顺序.这意味着提出这个令人不安的问题的人可能会感到悲伤.)

另一个原因是,这么多的WPF对象是其他对象的容器.如果XAML允许元素表示属性,那么如果需要表示具有与其可能包含的对象的类同名的属性的对象,则会被搞砸.例如,你当然可以创建一个ItemsControl具有Label属性的东西,但是如果你想Label在其Items属性中存储对象会发生什么?XAML中不会出现这种歧义:

<MyItemsControl>
   <MyItemsControl.Label>this is a property of MyItemsControl</MyItemsControl.Label>
   <Label>this is an item that MyItemsControl contains</Label>
</MyItemsControl>
Run Code Online (Sandbox Code Playgroud)