I坐标

博客园 首页 新随笔 联系 订阅 管理
MSDN上的一篇文章,讲述了XML文件的合并、架构验证以及Web服务的一些功能。
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);


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();

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>

对于客户端对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服务。
posted on 2005-01-20 14:30  I坐标  阅读(1911)  评论(3编辑  收藏  举报