使用DCOM输出XML文档

转载 2006年06月07日 14:46:00

准备数据

输出是一个文件,它简单地列出每个订单、依据客户信用限额来确定的订单处理情况,以及 customerid

<?xml version="1.0" encoding="UTF-8"?>
<processedOrders>
   <order>
	  <status>PROCESSED</status>
	  <customerid>2341</customerid>
	  <amount>874.00</amount>
   </order>
   <order>
	  <status>REJECTED</status>
	  <customerid>251222</customerid>
	  <amount>200.00</amount>
   </order>
</processedOrders>

应用程序首先创建要输出的 Document 对象。为方便起见,可以使用创建原先的 Document 的相同 DocumentBuilder 来创建新的 Document 对象。

...
   public static void main (String args[]) {
      File docFile = new File("orders.xml");
      Document doc = null;  
      Document newdoc = null;
      try {
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder db = dbf.newDocumentBuilder();
         doc = db.parse(docFile);
		 
         newdoc = db.newDocument();
		 
      } catch (Exception e) {
         System.out.print("Problem parsing the file: "+e.getMessage());
      }
...
   thisOrder.insertBefore(totalElement, thisOrder.getFirstChild());
}


Element newRoot = newdoc.createElement("processedOrders");

NodeList processOrders = doc.getElementsByTagName("order");
for (int orderNum = 0;
     orderNum < processOrders.getLength();
     orderNum++) {

   Element thisOrder = (Element)processOrders.item(orderNum);		  
		  
   Element customerid = 
                 (Element)thisOrder.getElementsByTagName("customerid")
                                          .item(0);
   String limit = customerid.getAttributeNode("limit").getNodeValue();
		 
   String total = thisOrder.getElementsByTagName("total").item(0)
                           .getFirstChild().getNodeValue();
		 
   double limitDbl = new Double(limit).doubleValue();
   double totalDbl = new Double(total).doubleValue();

   Element newOrder = newdoc.createElement("order");
		 
   Element newStatus = newdoc.createElement("status");
   if (totalDbl > limitDbl) {
      newStatus.appendChild(newdoc.createTextNode("REJECTED"));
   } else {
      newStatus.appendChild(newdoc.createTextNode("PROCESSED"));
   }
   
   Element newCustomer = newdoc.createElement("customerid");
   String oldCustomer = customerid.getFirstChild().getNodeValue();
   newCustomer.appendChild(newdoc.createTextNode(oldCustomer));
   
   Element newTotal = newdoc.createElement("total");
   newTotal.appendChild(newdoc.createTextNode(total));
		 
   newOrder.appendChild(newStatus);
   newOrder.appendChild(newCustomer);
   newOrder.appendChild(newTotal);
		 
   newRoot.appendChild(newOrder);
}
	  
newdoc.appendChild(newRoot);
	  
System.out.print(newRoot.toString());

...

在处理 orders.xml之后,应用程序创建了一个新的元素 processedOrders,这个新的元素最终将成为新文档的根元素。然后它遍历每个订单。对于每个订单,它都提取其 totallimit 信息。

接下来,应用程序为订单创建新元素:orderstatuscustomeridamount。它根据汇总款项是否超过客户的信用限额来填充status,然后相应地填充其他元素。

一旦应用程序为订单创建了元素,它就必须将这些元素整合起来。它首先向新的 order 元素添加状态、客户信息和汇总款项。然后它把新的 order 添加到newRoot元素。

虽然发生了所有这一切,但是 newRoot 元素并没有实际连接到某个父节点。当应用程序完成所有订单的处理时,newRoot就被追加到新文档。

应用程序将 newRoot 转换为一个 String,并简单地将它发送到 System.out,从而输出数据。

创建 XML 文件

现在应用程序已经创建了新的信息,将这个信息输出到某个文件是很简单的。

对数据也使用了相同的逻辑,只不过应用程序不是将它输出到屏幕,而是将它输出到一个文件。

要注意的一件重要事情是,由于 XML 数据不过就是文本,因此可以通过任何方式来对它进行格式化。例如,您可以创建 stepThroughAll() 的某种变化形式,它将创建预期的或打印完美的版本。只需记住这样将创建额外的空白(文本)节点即可。

...
import java.io.FileWriter;
...

try
{
   File newFile = new File("processedOrders.xml");
   FileWriter newFileStream = new FileWriter(newFile);

   newFileStream.write("<?xml version=/"1.0/"?>");

   newFileStream.write("<!DOCTYPE
"+doc.getDoctype().getName()+" ");

   if (doc.getDoctype().getSystemId() != null) {

      newFileStream.write(" SYSTEM ");

      newFileStream.write(doc.getDoctype().getSystemId());
   }
   if (doc.getDoctype().getPublicId() != null) {

      newFileStream.write(" PUBLIC ");

      newFileStream.write(doc.getDoctype().getPublicId());
   }

   newFileStream.write(">");

   newFileStream.write(newRoot.toString());

   newFileStream.close();

} catch (IOException e) {
    System.out.println("Can't write new file.");
}
...

COM 经验的八个教训(6):DCOM 不适于防火墙

DCOM 不适于防火墙关于 DCOM 特性和功能的一个常见问题是:“它能跨 Internet 工作吗?”DCOM 能够很好地跨 Internet 工作,只要将它配置为使用 TCP 或者 UDP,并且通...
  • juststone
  • juststone
  • 2005年03月12日 10:57
  • 2388

使用vb建立DCOM服务器端及客户端应用的详细过程(1)

使用vb建立DCOM服务器端及客户端应用的详细过程(1)   Window9x,WinNT Server和Winnt WorkStation平台都能支持DCOM。   本节介绍如何建立DCOM服务器端...
  • yangsaibing
  • yangsaibing
  • 2001年05月29日 14:34
  • 975

DCOM服务启动失败的解决办法

Q: DCOM 遇到错误“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。 ”,试图以参数“”启动服务 SENS 以运行服务器: {D3938AB0-5B9D-11D1-8DD2-00AA...
  • luocm
  • luocm
  • 2007年06月17日 10:26
  • 4840

关于控制Dcom程序使用端口的问题及解决方式

默认情况下,DCOM 使用 RPC 动态端口分配方式,该方式随机选择 1024 以上的端口号。另外,RPC 终结点映射服务使用端口 135。 要在内部防火墙上限制需要用来支持 DCOM 的端...
  • flyspace
  • flyspace
  • 2013年12月11日 14:04
  • 2225

DCOM服务端及客户端指定用户访问的安全设置

前言:对于分布式组件,在创建组件过程中常因权限问题导致出现“拒绝访问”,无法创建组件对象或使用接口。本人水平有限,只能谈些个人经验和体会,希望能抛砖引玉!   有两种方法能使得DCOM组件...
  • embededvc
  • embededvc
  • 2014年01月29日 06:04
  • 3453

使用vb建立DCOM服务器端及客户端应用的详细过程(3)

使用vb建立DCOM服务器端及客户端应用的详细过程(3) 分发服务器DCOM应用:   事实上,你已经可以在你的机器上运行程序了.如果你能在两台机器上测试你的应用,它更能表达DCOM分布的特点,在两台...
  • yangsaibing
  • yangsaibing
  • 2001年05月29日 14:47
  • 953

Windows2008Server在IIS 7.0配置DCOM

Windows2008Server在IIS 7.0配置DCOM 开发环境Word操作没有问题,在部署环境出现错误1:“检索 COM 类工厂中 CLSID 为 {000209FF-0000-0...
  • jackiehome
  • jackiehome
  • 2015年03月30日 15:55
  • 1264

DCOM揭秘

http://www.pcdog.com/p/html/2004927/27920042820_1.htm Distributed COM --跨网络工作  DCOM代表的是“Distributed(...
  • naive1010
  • naive1010
  • 2005年04月29日 16:06
  • 3619

OPC DCOM配置的一点经验

最近做了一个小项目,功能很简单,就是编写一个OPC客户端软件实现从OPC服务器上获取数据然后转存到DB中。项目虽小但是值得考虑的地方仍不少,所谓麻雀虽小,五脏俱全。...
  • rizhaolutong
  • rizhaolutong
  • 2014年03月03日 22:07
  • 4360

DCOM配置

要进行DCOM安全配置,操作者通常必须拥有客户和服务器计算机的管理员权限。   (1) 用户的建立及配置   最简单的用户配置是在客户和服务器计算机上建立名称、密码都相同...
  • mepsoft
  • mepsoft
  • 2015年09月16日 17:01
  • 1696
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用DCOM输出XML文档
举报原因:
原因补充:

(最多只允许输入30个字)