我已经使用xsd.exe实用程序Visual Studio 2003并2008从第三方XSD文件生成类型化数据集.第三方已经改变了他们的架构,所以我需要重新生成数据集,但我找不到XSD.EXE.
win8搜索为我提供了有关该实用程序的信息,但没有给出我在哪里,我尝试在Windows资源管理器中搜索并没有得到任何结果.
我读过关于Win7/VS 2008它的帖子说它是WinSDK的一部分,但我也找不到它在那个文件夹中.
一些海报说它现在需要下载但是从哪里下载.我正在64 bit Windows 8 pro和Visual Studio 2013 Ultimate.
我已经读过可以在visual studio(2010)中运行xsd命令.我的机器上有VS 2012,当我跑的时候
xsd XMLFile.xml
Run Code Online (Sandbox Code Playgroud)
我明白了
命令"xsd"无效.
那么,VS 2012中的"xsd"命令是不是被禁用了,还有其他方法可以在VS 2012中执行"xsd"吗?
我最近开始在我工作的地方推动TDD.到目前为止事情进展顺利.我们正在编写测试,我们让它们在提交时自动运行,我们一直在寻求改进我们的流程和工具.
我发现可以改进的一件事是我们如何设置我们的测试数据.在严格的单元测试中,我们经常发现自己实例化和填充复杂的CLR对象.这是一种痛苦,通常只在少数情况下进行测试.
我想要推动的是数据驱动测试.我认为我们应该能够从文件中加载我们的测试数据,甚至可以从模式中动态生成它们(尽管如果我可以生成对象的所有可能配置,那么我只考虑动态执行它)配置很小).而且有我的问题.
我还没有找到一个为C#CLR对象生成测试数据的好策略.
我研究了从XSD生成XML数据,然后使用它将其加载到我的测试中DataSourceAttribute.这似乎是一个很好的方法,但我遇到了生成XSD文件的麻烦. xsd.exe由于我们的类有接口成员,所以会失败.我也试过svcutil.exe在我们的程序集上使用,但因为我们的代码是单片的,所以输出是巨大而棘手的(许多相互依赖的.xsd文件).
有哪些其他生成测试数据的技术?理想情况下,生成器将遵循模式(可能是xsd,但最好是类本身),并且可以编写脚本.技术说明(不确定这是否相关,但不能伤害):
Microsoft.VisualStudio.TestTools.UnitTesting).谢谢
额外信息
我对此感兴趣的一个原因是测试我们的Adapter类.它需要一个复杂而复杂的遗留实体并将其转换为DTO.遗留实体是意大利面条的一团糟,不能轻易地分成由接口定义的逻辑子单元(如建议的那样).这将是一个很好的方法,但我们没有那么奢侈.
我希望能够生成这个遗留实体的大量配置,并通过适配器运行它们.配置数量越多,当下一个开发人员(无视应用程序的90%)更改旧实体的架构时,我的测试失败的可能性就越大.
UPDATE
为了澄清,我不打算为每次执行测试生成随机数据.我希望能够生成数据以涵盖复杂对象的多种配置.我想离线生成这些数据并将其存储为我的测试的静态输入.
我只是重新阅读了我的问题并注意到我实际上最初要求随机生成.我很惊讶我要求了!我已经更新了问题以解决这个问题.对此感到抱歉.
可能重复:
如何反序列化XML文档
假设我在C#中有一个这样定义的类:
public class Book
{
public string Title {get; set;}
public string Subject {get; set;}
public string Author {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
假设我有这样的XML:
<Book>
<Title>The Lorax</Title>
<Subject>Children's Literature</Subject>
<Author>Theodor Seuss Geisel</Author>
<Book>
Run Code Online (Sandbox Code Playgroud)
如果我想Book使用此XML 实例化该类的实例,我知道这样做的唯一方法是使用XML Document类并枚举XML节点.
.net框架是否提供了一些使用XML代码实例化类的方法?如果没有,实现这一目标的最佳做法是什么?
我正在尝试反序列化以下XML:
<?xml version="1.0" encoding="utf-8" ?>
<mf:somedata xmlns:mf="urn:somedata">
<CurrentAccount>
<AccountType>test</AccountType>
<Charge>
<ChargeType>test</ChargeType>
</Charge>
</CurrentAccount>
<CurrentAccount>
<AccountType>test 2</AccountType>
<Charge>
<ChargeType>test 2</ChargeType>
</Charge>
</CurrentAccount>
</mf:somedata>
Run Code Online (Sandbox Code Playgroud)
使用以下类:
[XmlRoot("somedata", Namespace = "urn:somedata")]
public class MfCurrentAccounts
{
[XmlElement("CurrentAccount")]
public CurrentAccount[] CurrentAccounts { get; set; }
}
public class CurrentAccount
{
public string AccountType { get; set; }
[XmlElement("Charge")]
public Charge[] Charges { get; set; }
}
public class Charge
{
public string ChargeType { get; set; }
}
var c = new XmlSerializer(typeof(MfCurrentAccounts)).Deserialize(new StringReader(xml)) as MfCurrentAccounts; …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 cXML 字符串反序列化为 C# 类。但是,在反序列化时,除了根元素之外,我似乎无法获得任何东西来反序列化。如何反序列化 XML 文档似乎提供了最多的帮助,并且使用该示例我已经成功地反序列化了根 cXML 标记,但这对嵌套对象不起作用,而嵌套对象PunchOutSetupRequest是我真正需要反序列化的对象。
在向您展示代码墙之前,我的问题是如何在不更改文件的情况下正确地将这些对象反序列化到下面定义的 cXML 类cXML.cs?由于这是一个标准,除非绝对必要,否则我不想编辑它。我的代码是公平游戏。预先感谢您提供的任何帮助,因为我知道这个主题在整个 SO 中已经广泛涉及。
我有一个 cXML 的 XSD 文件,我已使用该xsd.exe工具将其转换为 C# 类。我不会在此处粘贴整个架构,以避免淡化问题,但如果您需要更完整的图片,可以访问cxml.org 。
我的 cXML 代码仅反序列化属性,不包含 cXML 中定义的标头或请求对象:
using (TextReader reader = new StringReader(text))
{
try
{
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "cXML";
xRoot.IsNullable = true;
var serializer = new XmlSerializer(typeof(cXML), xRoot);
cxml = (cXML)serializer.Deserialize(reader);
}
catch (Exception ex)
{
string r = "";
}
}
Run Code Online (Sandbox Code Playgroud)
我的反序列化代码PunchOutSetupRequest。 …
我正在努力反序列化以下XML:
<?xml version="1.0" encoding="utf-8" ?>
<conf name="settings">
<item name="lorem"
one="the"
two="quick"
three="brown"
four="fox"
five="jumps"
six="over"
seven="the"
eight="lazy"
nine="dog"
/>
<item name="ipsum"
one="how"
two="many"
three="roads"
four="must"
five="a"
six="man"
seven="walk"
eight="down"
nine="?"
/>
</conf>
Run Code Online (Sandbox Code Playgroud)
希望以最优雅和简洁的方式使用LINQ-to-XML这样做,但考虑到我不是城里最聪明的孩子,当谈到嵌套方法,感染类型,泛型,等等,我认为它是是一个好主意,问你们是否有人愿意继续向我展示一些LINQ识字率:)
现在,对于我正在做的事情,每个价值:
XDocument config = XDocument.Load("whatever.conf");
var one = from q in config.Descendants("item")
select (string)q.Attribute("one");
var two = from q in config.Descendants("item")
select (string)q.Attribute("two");
Run Code Online (Sandbox Code Playgroud)
而且我知道我完全忽略了这一点,不仅因为我在那里重复了很多,而且因为只有一个项目才能查询,所以,如果你有任何评论或建议,那将非常感激.非常感谢!
更新:如果前一个例子可能没有真正帮助,这里有一个更现实的场景:
<?xml version="1.0" encoding="utf-8" ?>
<conf name="ftp-settings" freq="daily" time="23:00">
<item name="isis"
host="10.10.1.250"
user="jdoe"
pass="4/cB0kdFGprXR/3oTs8mtw=="
file="backup.tar.gz"
path="/var/log"
/>
<item name="seth"
host="10.10.2.250" …Run Code Online (Sandbox Code Playgroud) 我有一个如下定义的类:
[XmlRoot("ClassName")]
public class ClassName_0
{
//stuff...
}
Run Code Online (Sandbox Code Playgroud)
然后我创建一个ClassName_0列表,如下所示:
var myListInstance= new List<ClassName_0>();
Run Code Online (Sandbox Code Playgroud)
这是我用来序列化的代码:
var ser = new XmlSerializer(typeof(List<ClassName_0>));
ser.Serialize(aWriterStream, myListInstance);
Run Code Online (Sandbox Code Playgroud)
这是我用来反序列化的代码:
var ser = new XmlSerializer(typeof(List<ClassName_0>));
var wrapper = ser.Deserialize(new StringReader(xml));
Run Code Online (Sandbox Code Playgroud)
如果我将它序列化为xml,则生成的xml如下所示:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfClassName_0 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ClassName_0>
<stuff></stuff>
</ClassName_0>
<ClassName_0>
<stuff></stuff>
</ClassName_0>
</ArrayOfClassName_0>
Run Code Online (Sandbox Code Playgroud)
有没有办法序列化并能够从/向ClassName_0列表反序列化以下内容?
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfClassName xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ClassName>
<stuff></stuff>
</ClassName>
<ClassName>
<stuff></stuff>
</ClassName>
</ArrayOfClassName>
Run Code Online (Sandbox Code Playgroud)
谢谢!
我试图在C#中反序列化我的packages.config文件,但我回来的Collection总是为null.如果我的xml文件由单个属性集合组成,是否需要特殊的东西?
[Serializable()]
[System.Xml.Serialization.XmlTypeAttribute()]
public class Package
{
[System.Xml.Serialization.XmlAttribute("id")]
public string Id {get;set;}
[System.Xml.Serialization.XmlAttribute("version")]
public string Version {get;set;}
}
[Serializable()]
[System.Xml.Serialization.XmlRoot("packages")]
public class PackageCollection
{
[System.Xml.Serialization.XmlArrayItem("package", typeof(Package))]
public Package[] Packages {get;set;}
}
void Main()
{
var path = "C:\D\packages.config";
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(PackageCollection), new System.Xml.Serialization.XmlRootAttribute("packages"));
StreamReader reader = new StreamReader(file);
var packages2 = (PackageCollection)serializer.Deserialize(reader);
reader.Close();
}
Run Code Online (Sandbox Code Playgroud)
我的packages.config看起来像
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Autofac" version="3.3.1" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="4.0.20710.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Tracing" version="4.0.30506" targetFramework="net45" …Run Code Online (Sandbox Code Playgroud) 我正在开发Windows应用商店应用程序.
我有以下手动创建的Fault类:
[XmlRoot(Namespace = "http://schemas.xmlsoap.org/soap/envelope/", ElementName = "Fault")]
public partial class SoapFault
{
[XmlElement(Form = XmlSchemaForm.Unqualified, ElementName = "faultcode")]
public String FaultCode { get; set; }
[XmlElement(Form = XmlSchemaForm.Unqualified, ElementName = "faultstring")]
public String FaultDescription { get; set; }
[XmlElement(Form = XmlSchemaForm.Unqualified, ElementName = "detail")]
public InnerException[] Detail { get; set; }
}
[XmlType(Namespace = "http://my.namespace.com", TypeName = "InnerException")]
public partial class InnerException
{
[XmlElement(Form = XmlSchemaForm.Unqualified, ElementName = "message")]
public String Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我试图阅读的服务器的回复:
<env:Envelope …Run Code Online (Sandbox Code Playgroud)