http://www.microsoft.com/china/MSDN/library/data/xml/mis0303XMLFiles.mspx
看完后,大受启发。
说起来真惭愧,以前合并XML文档都是通过读取源XML文档的innerXML,然后与目标XML文档的innerXML组合,没想到还有这么好的方法:
1、通过XmlNode的ImportNode方法,不过ImportNode只是在文档之间传输对象的控制,因此还需要调用AppendNode方法,或者其它的Node的插入方式来把Node添加到目的文档中。不过这样可以控制到Node,对于只需要合并特定的Node的过程有较好的控制能力。
XmlDocument doc = new XmlDocument();
XmlNode cont = doc.CreateElement("Container");
doc.AppendChild(cont);
XmlDocument stuff = new XmlDocument();
stuff.Load("product.xml");
XmlNode imported =
doc.ImportNode(stuff.DocumentElement, true);
doc.DocumentElement.AppendChild(imported);
stuff.Load("material.xml");
imported = doc.ImportNode(stuff.DocumentElement, true);
doc.DocumentElement.AppendChild(imported);
Console.WriteLine(doc.InnerXml);
XmlNode cont = doc.CreateElement("Container");
doc.AppendChild(cont);
XmlDocument stuff = new XmlDocument();
stuff.Load("product.xml");
XmlNode imported =
doc.ImportNode(stuff.DocumentElement, true);
doc.DocumentElement.AppendChild(imported);
stuff.Load("material.xml");
imported = doc.ImportNode(stuff.DocumentElement, true);
doc.DocumentElement.AppendChild(imported);
Console.WriteLine(doc.InnerXml);
2、通过XmlReader和XmlWriter。一个XmlWriter负责生成目的XML文档,多个XmlReader负责读入多个源XML文档。XmlWriter提供有WriteNode方法,可以把XmlReader对象写入节点。不过,从表面上看,似乎更适合整篇XML文档的合并。
XmlWriter tw = new XmlTextWriter(Console.Out);
tw.WriteStartDocument();
tw.WriteStartElement("Container");
XmlTextReader reader = new XmlTextReader("product.xml");
tw.WriteNode(reader, true);
reader = new XmlTextReader("material.xml");
tw.WriteNode(reader, true);
tw.WriteEndElement();
tw.WriteEndDocument();
tw.WriteStartDocument();
tw.WriteStartElement("Container");
XmlTextReader reader = new XmlTextReader("product.xml");
tw.WriteNode(reader, true);
reader = new XmlTextReader("material.xml");
tw.WriteNode(reader, true);
tw.WriteEndElement();
tw.WriteEndDocument();
3、XSLT。这个也是一个比较通用的方法,但是需要较复杂的XSLT指令来达到一些特定的合并目的,但是毫无疑问,相当简单。
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Container>
<xsl:copy-of select="document('product.xml')"/>
<xsl:copy-of select="document('material.xml')"/>
</Container>
</xsl:template>
</xsl:stylesheet>
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Container>
<xsl:copy-of select="document('product.xml')"/>
<xsl:copy-of select="document('material.xml')"/>
</Container>
</xsl:template>
</xsl:stylesheet>
对于客户端对Web服务的引用管理,以前都是在VS.NET直接引用Web服务,由于引用时,工具自动把Web服务的地址硬编码到了代码中,因此,为了防止Web服务的地址修改,就不得不手工修改代码,并引入一个XML文件专门记录Web服务的地址,现在看来,那都是“杨白劳”:-P。
原来在Web服务引用工具wsdl.exe中,有一个参数:appsettingurlkey.通过指定这个参数的值,就可以通过在应用程序配置文件中增加appSetting达到管理Web服务的目的。例如:
wsdl.exe /appsettingurlkey:EchoServiceLocation http://localhost/echoservice/echo.asmx?wsdl
那么只要在配置文件中增加:<configuration>
<appSettings>
<add key="EchoServiceLocation"
value="http://localhost/echoservice/echo.asmx" />
</appSettings>
</configuration>
就可以了。不需要而外的修改代码,也不需要增加新的配置文件。
这篇文章还讲了如何通过UDDI管理Web服务引用,通过Post和Get方式,以及JavaScript调用Web服务。