在XSD,SOAP和其他XML约定中,您经常会看到以下内容:
<book>
<title>Harry Potter</title>
<author>J.K. Rowling</author>
</book>
Run Code Online (Sandbox Code Playgroud)
现在我想知道,属性发生了什么?对我而言,将其写为:
<book title="Harry Potter" author="J.K. Rowling" />
Run Code Online (Sandbox Code Playgroud)
但显然,出于某种原因,比我聪明的人选择了其他方式.有人可以解释为什么,那么属性是什么?
我有一个使用VS2010开发的WCF Web服务,目标是.Net Framework 4,它使用xsd.exe从xsd架构生成的序列化类.
当我从服务请求xsd时(http:// localhost:59120/Service1.svc?xsd = xsd2),将忽略元素属性.EG在下面的架构片段中 -
<xs:element name="id"...>
Run Code Online (Sandbox Code Playgroud)
应该是一个属性 -
<xs:attribute name="id"...>
Run Code Online (Sandbox Code Playgroud)
来自xsd请求的片段 -
...
<xs:sequence>
<xs:element name="address" type="xs:string" nillable="true"/>
<xs:element name="emailId" type="xs:string" nillable="true"/>
<xs:element name="id" type="xs:string" nillable="true"/>
<xs:element name="items" type="tns:ArrayOfArrayOfOrdersCustomerItemsItem" nillable="true"/>
<xs:element name="name" type="xs:string" nillable="true"/>
</xs:sequence>
...
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我的类中的语句"[XmlAttributeAttribute()]"被忽略我已经尝试将其更改为[XmlAttribute()]和[XmlAttributeAttribute("Id")]并完全删除该行,但它没有区别所有.
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[XmlTypeAttribute(AnonymousType = true)]
public partial class OrdersCustomer
{
/// <remarks/>
[XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
public string Name;
/// <remarks/>
[XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 1)]
public string Address;
/// …Run Code Online (Sandbox Code Playgroud) 我试图使用XmlAttributeOverrides来控制哪些类属性在序列化后显示在xml中。它适用于“根”类上的属性,但不适用于嵌套属性。这是一个简单的示例,以说明我要完成的工作。
我的班级层次结构如下:
public class Main
{
public string Name { get; set; }
public Location Address { get; set; }
}
public class Location
{
public string StreetAddress { get; set; }
public Contact ContactInfo{ get; set; }
}
public class Contact
{
public string PhoneNumber { get; set; }
public string EmailAddr { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我序列化Main()时,我得到如下信息:
<Main>
<Name></Name>
<Address>
<StreetAddress></StreetAddress>
<ContactInfo>
<PhoneNumber></PhoneNumber>
<EmailAddr></EmailAddr>
</ContactInfo>
</Address>
</Main>
Run Code Online (Sandbox Code Playgroud)
我所能做的就是通过使用以下命令来避免显示名称或地址:
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes(); …Run Code Online (Sandbox Code Playgroud) 我将 XML 存储到数据库中,标签名称不同,但属性名称相同:
<book Category="Hobbies And Interests" PropertyName="C#" CategoryID="44" />
<sport Category="Hobbies And Interests" PropertyName="Cricket" CategoryID="46" />
Run Code Online (Sandbox Code Playgroud)
这只是两个示例,但标签名称可以是任何内容。我想从所有节点读取“PropertyName”属性。
是否可以?如果是,那么请任何人指导我。
我试图定义一个可以在后续元素定义中引用的属性.
<xs:attribute name="ridref" type="xs:string"/>
Run Code Online (Sandbox Code Playgroud)
后来我像这样使用它:
<xs:element name="coordRegRef">
<xs:complexType>
<!--xs:attribute name="ridref" type="xs:string"/ this works but I want to use ref -->
<xs:attribute ref="ridref" use="required"/>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
XSD使用xmllint编译好
xmllint --schema pc-ar.xsd pc-ar.xml
Run Code Online (Sandbox Code Playgroud)
但是xmllint说
pc-ar.xml:41: element coordRegRef: Schemas validity error : Element '{http://pc-ar.xsd}coordRegRef', attribute 'ridref': The attribute 'ridref' is not allowed.
pc-ar.xml:41: element coordRegRef: Schemas validity error : Element '{http://pc-ar.xsd}coordRegRef': The attribute '{http://pc-ar.xsd}ridref' is required but missing.
Run Code Online (Sandbox Code Playgroud)
我解释为我的XML文件必须使用ridref的命名空间
<coordRegRef fix:ridref="111"/>
Run Code Online (Sandbox Code Playgroud)
(这确实有效,但不受欢迎)而不是
<coordRegRef ridref="111"/>
Run Code Online (Sandbox Code Playgroud)
为什么?
我的XSD
<?xml version="1.0"?>
<!-- validate: xmllint - -schema pc-ar.xsd …Run Code Online (Sandbox Code Playgroud) 考虑一下这个xml:
<parent>
<child name="alpha" />
</parent>
Run Code Online (Sandbox Code Playgroud)
还有这个xml
<parent>
<child name="beta" />
</parent>
Run Code Online (Sandbox Code Playgroud)
/ parent/child应该只有一个sinlge节点,其alpha或beeta为其名称值.
为了澄清......永远不会有2个子节点,每个节点都命名为alpha和beta
我正在尝试创建一个单独的xpath查询,它将在这两种情况中返回name的值.
我试过这个......
/parent/child[@name='alpha' | @name='beta']/@name
Run Code Online (Sandbox Code Playgroud)
......但它不起作用.
我应该如何归还这个值..?
更新:我推荐了样本以确保它们形成良好,因为一个答案表明它们不是.
我目前正在阅读与序列化相关的序列化和C#属性(XmlRoot,XmlElement,XmlArray,...).
我想输出这样的东西:
<root>
<a>...</a>
<b>...</b>
<c>...</c>
<c>...</c>
<c>...</c>
</root>
Run Code Online (Sandbox Code Playgroud)
(c元素多次出现)
但是如果c不将它们放在特定的"数组/列表节点"中,我就不会得到多个.
因为我真的不想那样:
<root>
<a>...</a>
<b>...</b>
<cList>
<c>...</c>
<c>...</c>
<c>...</c>
</cList>
</root>
Run Code Online (Sandbox Code Playgroud)
怎么能实现这一目标?
我通过提供相应的公共财产将一些公共领域改为私人.
例如:
public string Name;
Run Code Online (Sandbox Code Playgroud)
改变了
private string _name;
public string Name
{
get{ return _name;}
set{ _name = value;}
}
Run Code Online (Sandbox Code Playgroud)
但是,原始公共字段的[XmlAttribute]属性呢?即
[XmlAttribute]
public string Name;
Run Code Online (Sandbox Code Playgroud)
变为:
[XmlAttribute]
private string _name;
public string Name
{
get{ return _name;}
set{ _name = value;}
}
Run Code Online (Sandbox Code Playgroud)
要么
private string _name;
[XmlAttribute]
public string Name
{
get{ return _name;}
set{ _name = value;}
}
Run Code Online (Sandbox Code Playgroud) 使用encoding/xml.Decoder我试图手动解析从http://www.khronos.org/files/collada_schema_1_4加载的XML文件
出于测试目的,我只是迭代文档打印出遇到的任何令牌类型:
func Test (r io.Reader) {
var t xml.Token
var pa *xml.Attr
var a xml.Attr
var co xml.Comment
var cd xml.CharData
var se xml.StartElement
var pi xml.ProcInst
var ee xml.EndElement
var is bool
var xd = xml.NewDecoder(r)
for i := 0; i < 24; i++ {
if t, err = xd.Token(); (err == nil) && (t != nil) {
if a, is = t.(xml.Attr); is { print("ATTR\t"); println(a.Name.Local) }
if pa, is = t.(*xml.Attr); is { print("*ATTR\t"); …Run Code Online (Sandbox Code Playgroud) 我知道TextView有一个属性被调用fontFamily,我认为你可以通过改变这个属性的值来改变文本的字体.所以我写道:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="my text"
android:fontFamily="OCR A Std"
android:textSize="20pt"/>
Run Code Online (Sandbox Code Playgroud)
然后我运行应用程序,但文本的字体仍然是普通的旧Arial字体.我认为必须有一种方法在android中使用花哨的字体,对吧?
如果我只是不能使用花哨的字体,什么字体(es)android支持?只有Arial是不可能的,对吧?
这是我的 XML 文件的一部分
<summary>
<testcase>
<result value="-45">100</result>
<result value="0">200</result>
<result value="45">300</result>
</testcase>
<testcase>
<result value="-45">1000</result>
<result value="0">2000</result>
<result value="45">3000</result>
</testcase>
<testcase>
<result value="-45">0.1</result>
<result value="0">0.2</result>
<result value="45">0.3</result>
</testcase>
</summary>
Run Code Online (Sandbox Code Playgroud)
我需要通过按属性名称过滤来获取元素值。
作为示例,我需要获取属性 = 45 的所有值,然后答案是 300,3000,0.3
XmlDocument doc = new XmlDocument();
doc.Load(_xmlFilePath);
XmlNodeList nodelist = doc.SelectNodes("//testcase");
for (int i = 0; i < nodelist.Count; i++)
{
Double value;
Double.TryParse(nodelist[i].SelectSingleNode("result").Attributes["45"].InnerText, out value);
Console.WriteLine("value : " + value);
}
Run Code Online (Sandbox Code Playgroud)
但上面的代码给出了以下错误消息。
你调用的对象是空的。
任何建议表示赞赏。
谢谢。
xml-attribute ×11
xml ×6
c# ×4
xsd ×4
android ×1
attributes ×1
class ×1
fonts ×1
go ×1
sql-server ×1
wcf ×1
web-services ×1
xml-parsing ×1
xmldocument ×1
xmlignore ×1
xmllint ×1
xmlnode ×1
xpath ×1