我尝试使用axis2(1.5.1)版本从wsdl文件生成java代码,但我无法弄清楚什么是正确的pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-wsdl2code-maven-plugin</artifactId>
<version>1.5.1</version>
<executions>
<execution>
<goals>
<goal>wsdl2code</goal>
</goals>
<configuration>
<wsdlFile>src/main/resources/wsdl/stockquote.wsdl</wsdlFile>
<databindingName>xmlbeans</databindingName>
<packageName>a.bc</packageName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2</artifactId>
<version>1.5.1</version>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
当我输入mvn编译时,它会抱怨
Retrieving document at 'src/main/resources/wsdl/stockquote.wsdl'.
java.lang.ClassNotFoundException: org.apache.xml.serializer.TreeWalker
Run Code Online (Sandbox Code Playgroud)
如果我试图找到TreeWalker,找到一个合适的jar文件是一团糟.
你有人能给我一些提示吗?或者给我正确的pom.xml
[更新] xalan-2.7.0.jar也需要依赖,并且jar文件被破坏(由于nexus问题),thx pascal
我正在使用XmlSerializer序列化对象并将其写入文件.我已经取得了相当大的成功,序列化器在嵌套元素方面做了我想做的事情,以及序列化为元素与属性的内容.不幸的是,我遇到了一个问题,我需要一个类的一个成员在另一个之前序列化.在其他地方,对我来说,无论先声明的是什么,都会先被序列化,但在这种情况下,我并没有取得如此大的成功.有没有办法手动控制事物序列化的顺序?
我使用以下代码创建一个xml文档 -
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
new XmlSerializer(typeof(docket)).Serialize(Console.Out, i, ns);
Run Code Online (Sandbox Code Playgroud)
这非常适合创建没有命名空间属性的xml文件.我想在根元素中也没有编码属性,但我找不到办法.有没有人知道是否可以这样做?
谢谢
在C#中使用XML序列化时,我使用如下代码:
public MyObject LoadData()
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyObject));
using (TextReader reader = new StreamReader(settingsFileName))
{
return (MyObject)xmlSerializer.Deserialize(reader);
}
}
Run Code Online (Sandbox Code Playgroud)
(以及类似的反序列化代码).
它需要铸造而且不是很好.有没有办法,直接在.NET Framework中使用泛型与序列化?也就是说写下这样的东西:
public MyObject LoadData()
{
// Generics here.
XmlSerializer<MyObject> xmlSerializer = new XmlSerializer();
using (TextReader reader = new StreamReader(settingsFileName))
{
// No casts nevermore.
return xmlSerializer.Deserialize(reader);
}
}
Run Code Online (Sandbox Code Playgroud) 有没有办法使XmlSerializer原始类成员(例如字符串属性)序列化为XML属性,而不是XML元素,而不必[XmlAttribute]在每个属性声明前写入?即是否有一个全局开关告诉XmlSerializer将所有原始类成员序列化为XML属性?
假设我们有以下类:
public class Person
{
public string FirstName
{
...
}
public string LastName
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
然后XmlSerializer默认生成此代码:
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
Run Code Online (Sandbox Code Playgroud)
但是,我想要的是这段代码:
<Person FirstName="John" LastName="Doe"/>
Run Code Online (Sandbox Code Playgroud)
再说一遍:我想在没有[XmlAttribute](或没有XmlAttributeOverrides,这将是更多的工作)的情况下做到这一点.
一种可能的解决方案是使用通用后处理步骤,该步骤应用XSLT转换将元素转换为属性.但我想知道是否有一个更简单的解决方案.
我有一个用C#的XmlSerializer序列化的类.它标有XmlRoot属性,我想在派生类中继承此属性.
查看文档时,它没有说XmlRoot使用AttributeUsageAttribute将Inherit设置为false(Inherit应该默认为true),但是在尝试反序列化没有XmlRoot属性的继承类时出错("<rootNode xmlns ='' >没想到.").
这目前有效:
[Serializable()]
[XmlRoot("rootNode")]
public class BaseClass
{
[XmlAttribute("attributeA")]
public int A { get; set; }
}
[Serializable()]
[XmlRoot("rootNode")]
public class InheritedClass : BaseClass
{
[XmlElement("elementB")]
public int B { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,但我想要的是:
[Serializable()]
[XmlRoot("rootNode")]
public class BaseClass
{
[XmlAttribute("attributeA")]
public int A { get; set; }
}
[Serializable()]
public class InheritedClass : BaseClass
{
[XmlElement("elementB")]
public int B { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我可能会尝试将反序列化的XML InheritedClass看起来像这样:
<rootNode attributeA="abc">
<elementB>123</elementB> …Run Code Online (Sandbox Code Playgroud) 早上好,
我有一个从List下载并拥有公共属性的集合.Xml序列化程序没有提升我的能力.列表项序列化很好.我尝试过XmlAttribute属性无济于事.你们有解决方案吗?
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
var people = new PersonCollection
{
new Person { FirstName="Sue", Age=17 },
new Person { FirstName="Joe", Age=21 }
};
people.FavoritePerson = "Sue";
var x = new XmlSerializer(people.GetType());
var b = new StringBuilder();
var w = XmlTextWriter.Create(b, new XmlWriterSettings { NewLineChars = "\r\n", Indent = true });
x.Serialize(w, people);
var s = b.ToString();
}
}
[XmlRoot(ElementName="People")]
public class PersonCollection : …Run Code Online (Sandbox Code Playgroud) 我在WCF调用上收到以下错误:
在对象图中可以序列化或反序列化的最大项数是'65536'
我已经阅读了大量的论坛帖子,其中许多人提到修改app.config和web.config以指定允许更大对象图的新行为.我已经做到了,这就是我在这些文件中所拥有的:
关于WPF项目的App.Config:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="">
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="digiPM.Shell.LogOutPMSEMRService.PMSEMRLogOutService">
<!--<endpoint address="" binding="basicHttpBinding" contract="digiPM.Shell.LogOutPMSEMRService.IPMSEMRLogOutService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/Design_Time_Addresses/digiPM.Shell.LogOutPMSEMRService/PMSEMRLogOutService/" />
</baseAddresses>
</host>-->
<endpoint address="" binding="netTcpBinding" name="NetTcpBindingEndpoint" contract="digiPM.Shell.LogOutPMSEMRService.IPMSEMRLogOutService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" name="MexTcpBidingEndpoint" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8732/Design_Time_Addresses/digiPM.Shell.LogOutPMSEMRService/PMSEMRLogOutService/" />
</baseAddresses>
</host>
</service>
</services>
<!--binding info - …Run Code Online (Sandbox Code Playgroud) .net wcf datacontractserializer servicebehavior xmlserializer
我正在使用XmlSerializer与服务进行通信.这不是常规的SOAP服务,它有自己的XML对象类型.例如,我可能会要求一个<Capabilities>对象,但它可能会返回一个<Exception>.换句话说,我必须处理随机的XML文档类型.但是,我知道我必须处理哪些类型.
我想要做的是找到一个通用的方法来序列化/反序列化这些文档.问题是XmlSerializer需要在创建阶段知道类型.
这些不是封装在公共根元素中,因此[XmlInclude]在这种情况下,创建基类并使用该属性不起作用:
[XmlInclude(typeof(Exception))]
[XmlInclude(typeof(Capabilities))]
public abstract class BaseClass
{
public BaseClass()
{
SchemaLocation = "test";
}
[XmlAttribute("schemaLocation")]
public String SchemaLocation { get; set; }
}
[XmlRoot("Exception")]
public class Exception : BaseClass
{
public Exception():base()
{
}
[XmlElement]
public String Message { set; get; }
}
[XmlRoot("Capabilities")]
public class Capabilities : BaseClass
{
public Capabilities() : base()
{}
[XmlElement]
public String ServiceName { set; get; }
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的解决方案是使用XmlReader手动探测根元素,然后在创建XmlSerializer实例之前将其映射到正确的类型.
有没有更好的方法呢?
在C#(.net 4.0和4.5/vs2010和vs12)中,当我使用XMLSerializer序列化包含具有非法字符的字符串的对象时,不会引发错误.但是,当我反序列化该结果时,会抛出"无效字符"错误.
// add to XML
Items items = new Items();
items.Item = "\v hello world"; // contains "illegal" character \v
// variables
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Items));
string tmpFile = Path.GetTempFileName();
// serialize
using (FileStream tmpFileStream = new FileStream(tmpFile, FileMode.Open, FileAccess.ReadWrite))
{
serializer.Serialize(tmpFileStream, items);
}
Console.WriteLine("Success! XML serialized in file " + tmpFile);
// deserialize
Items result = null;
using (FileStream plainTextFile = new FileStream(tmpFile, FileMode.Open, FileAccess.Read))
{
result = (Items)serializer.Deserialize(plainTextFile); //FAILS here
}
Console.WriteLine(result.Item);
Run Code Online (Sandbox Code Playgroud)
"Items"只是由xsd/c Items.xsd自动生成的一个小类.Items.xsd只不过是一个包含一个子元素(Item)的根元素(Items):
<?xml version="1.0" …Run Code Online (Sandbox Code Playgroud) xmlserializer ×10
c# ×7
.net ×3
attributes ×2
generics ×2
axis2 ×1
inheritance ×1
list ×1
maven-2 ×1
oop ×1
wcf ×1
wsdl ×1
wsdl2code ×1
xml ×1