如何用UDP编程去接受并解析UDP端口上接受到的以下数据: 消息格式(接口事例) 如下: <?xml version="1.0" encoding="utf-8" ?>
<!--短信发送-->
<MainMsg>
  <MsgType>DXJR01</MsgType>
  <MsgSender>192.168.0.1:8888</MsgSender>
  <MsgReceiver>192.168.0.2:8888</MsgReceiver>
  <MsgContent>
  <DXUUID>UUID</DXUUID>
<SJHMLB>   
<!--一次可以包含多个手机号码,短信群发-->
<SJHM>手机号码1</SJHM>
<SJHM>手机号码2</SJHM>
  </SJHMLB>
  <DXNR>短信内容</DXNR>
  <!--短信内容有长度限制:长度限制在1k字节以内,即500汉字,具体短信拆分后发送由短信接入系统实现-->
  <JGDM>发送机构代码</JGDM>
  <XTDM>发送系统代码</XTDM>
  <YXJ>短信优先级</YXJ>
  </MsgContent>
</MainMsg>接收到的是一个何类型的格式?如何解析成xml文档?请高手们用简单代码提醒下~

解决方案 »

  1.   

    需要用dom4j或者jdom来解析,楼主可以自己看一下
      

  2.   

    这是用JDOM根据你的格式解析的实例,如果允许这个实例需要先现在jdom.jar加入环境变量import org.xml.sax.InputSource;
    import org.jdom.input.SAXBuilder;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;import java.io.StringReader;
    import java.io.IOException;
    import java.io.File;
    import java.util.List;/**
     * Created by IntelliJ IDEA.
     * User: admin
     * Date: 2011-9-1
     * Time: 9:05:04
     * To change this template use File | Settings | File Templates.
     */
    public class CSDNDemo2 {
        String content= "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
                "<!--短信发送-->\n" +
                "<MainMsg>\n" +
                "  <MsgType>DXJR01</MsgType>\n" +
                "  <MsgSender>192.168.0.1:8888</MsgSender>\n" +
                "  <MsgReceiver>192.168.0.2:8888</MsgReceiver>\n" +
                "  <MsgContent>\n" +
                "  <DXUUID>UUID</DXUUID>\n" +
                "<SJHMLB>\n" +
                "<!--一次可以包含多个手机号码,短信群发-->\n" +
                "<SJHM>手机号码1</SJHM>\n" +
                "<SJHM>手机号码2</SJHM>\n" +
                "  </SJHMLB>\n" +
                "  <DXNR>短信内容</DXNR>\n" +
                "  <!--短信内容有长度限制:长度限制在1k字节以内,即500汉字,具体短信拆分后发送由短信接入系统实现-->\n" +
                "  <JGDM>发送机构代码</JGDM>\n" +
                "  <XTDM>发送系统代码</XTDM>\n" +
                "  <YXJ>短信优先级</YXJ>\n" +
                "  </MsgContent>\n" +
                "</MainMsg>";            /**
                 * 如果数据源是xml文件
                 * @param file
                 */
        public void readUDPData(File file) {
            System.out.println(file.getAbsolutePath());
    //        StringReader read = new StringReader(xmlStr);
    // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
    //        InputSource source = new InputSource(read);
    // 创建一个新的SAXBuilder
            SAXBuilder sb = new SAXBuilder();
            try {
                // 通过输入源构造一个Document
                Document doc = sb.build(file);
                // 取的根元素
                Element root = doc.getRootElement();           Element type=root.getChild("MsgType");
               System.out.println("类型:"+type.getText());
               Element sender=root.getChild("MsgSender");
                System.out.println("发送者"+sender.getText());
               Element receiver=root.getChild("MsgReceiver");
                System.out.println("接受者"+receiver.getText());
               Element content= root.getChild("MsgContent");
                System.out.println("内容"+content.getText());           Element DXUUID=content.getChild("DXUUID");
                System.out.println("DXUUID:"+DXUUID.getText());
               Element SJHMLB=content.getChild("SJHMLB");           List<Element> SJHMList=SJHMLB.getChildren("SJHM");
                for(Element e:SJHMList){
                    System.out.println("手机号码:"+e.getText());
                }
                
               Element DXNR=content.getChild("DXNR");
                System.out.println("DXNR:"+DXNR.getText());
               Element JGDM=content.getChild("JGDM");
                System.out.println("JGDM:"+JGDM.getText());
               Element XTDM=content.getChild("XTDM");
                System.out.println("XTDM:"+XTDM.getText());
               Element YXJ=content.getChild("YXJ");
                System.out.println("YXJ:"+YXJ.getText());        } catch (JDOMException e) {
                e.printStackTrace();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }    }    public void readUDPData(String xmlStr) {
            System.out.println(xmlStr);
            StringReader read = new StringReader(xmlStr);
    // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
            InputSource source = new InputSource(read);
    // 创建一个新的SAXBuilder
            SAXBuilder sb = new SAXBuilder();
            try {
    // 通过输入源构造一个Document
                Document doc = sb.build(source);
    // 取的根元素
                 Element root = doc.getRootElement();
                 Element type=root.getChild("MsgType");
               System.out.println("类型:"+type.getText());
               Element sender=root.getChild("MsgSender");
                System.out.println("发送者"+sender.getText());
               Element receiver=root.getChild("MsgReceiver");
                System.out.println("接受者"+receiver.getText());
               Element content= root.getChild("MsgContent");
                System.out.println("内容"+content.getText());           Element DXUUID=content.getChild("DXUUID");
                System.out.println("DXUUID:"+DXUUID.getText());
               Element SJHMLB=content.getChild("SJHMLB");           List<Element> SJHMList=SJHMLB.getChildren("SJHM");
                for(Element e:SJHMList){
                    System.out.println("手机号码:"+e.getText());
                }           Element DXNR=content.getChild("DXNR");
                System.out.println("DXNR:"+DXNR.getText());
               Element JGDM=content.getChild("JGDM");
                System.out.println("JGDM:"+JGDM.getText());
               Element XTDM=content.getChild("XTDM");
                System.out.println("XTDM:"+XTDM.getText());
               Element YXJ=content.getChild("YXJ");
                System.out.println("YXJ:"+YXJ.getText());        } catch (JDOMException e) {
                e.printStackTrace();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
    //        return "OK";
        }    public static void main(String[] args){
            File demo1=new File("resources\\xml\\demo2.xml");
            CSDNDemo2 reader=new CSDNDemo2();
    //        reader.readUDPData(demo1);
            reader.readUDPData(reader.content);
        }
    }
      

  3.   

    谢谢,很是受益!!但是,我利用以下函数取到返回的 string 放在eadUDPData()函数中就抱错 什么原因阿public  String receive() 
    {
     try{ 
      //创建数据报套接字,并绑定到固定端口。 
       DatagramSocket ds = new DatagramSocket(6000); 
       byte[] buf = new byte[8000]; //声明byte数组,用于接收客户端Client输入 
       //创建接收数据的UDP包    new DatagramPacket(byte[],length);   
       DatagramPacket dp = new DatagramPacket(buf,8000);   
       ds.receive(dp);  //服务器端Server读取客户端Client的数据,并将数据保存到UDP包对象中 
       
       ds.close(); 
       return new String(buf,0,dp.getLength());
      
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
       return null;
      } 
      

  4.   

    这已经是另外一个问题了,不宜在这个帖子里面讨论,而且你这样说无头无脑没法帮你,这个帖子就是XML数据的问题
      

  5.   

    貌似LZ问题解决了
    LS的xml解析代码LZ可以参考,LZ的另一贴也有人回复了如何接收数据了