Menu

如何从xml文档获取家庭电话类型?

莫莫克什

会员
已加入
2016年12月13日
留言内容
12
编程经验
1-3
我的C#代码返回xml文档中的第一个电话号码,无论其类型如何。
但是要求是我的C#代码应仅以某个顺序根据xml文档中找到的类型返回一个电话号码。
我在下面发布的xml文档代码中将看到4种电话号码。
按类型显示电话号码的条件如下:
1.在xml中检查Phone Current ="true"。之后,显示电话号码,其中Type Word ="HOME"第一。如果找不到此类型,请查找Type Word ="CELL"并显示它。如果未找到,则查找Type Word ="WORK"并显示它。如果找不到上述所有类型,请查找Type Word ="FAX"并显示传真号码。

XML格式 文件文件
C#:
<?xml version="1.0" encoding="UTF-8"?>
< Integration> 
  <Party ID="1">
   <Phone>
    <Type Word="WORK">Work</Type>
    <Number>218-222-2222</Number>
   </Phone>
   <Phone Current="true"> 
    <Type Word="FAX">Fax</Type>
    <Number>218-777-7777</Number>
   </Phone>
   <Phone>
    <Type Word="HOME">Home</Type>
    <Number>218-333-3333</Number>
   </Phone>
   <Phone>
    <Type Word="CELL">Cell</Type>
    <Number>218-555-5555</Number>
   </Phone>
   <Phone Current="true">
    <Type Word="CELL">Cell</Type>
    <Number>218-666-6666</Number>
   </Phone>
   <Phone Current="true">
    <Type Word="HOME">Home</Type>
    <Number>218-300-0011</Number>
   </Phone>
   <Phone Current="true">
    <Type Word="WORK">Work</Type>
    <Number>218-111-0000</Number>
   </Phone>
   <Phone> 
    <Type Word="FAX">Fax</Type>
    <Number>218-000-9999</Number>
   </Phone>
< /Integration>

C#代码
C#:
using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Xml;
 namespace Msc.Integration.Mncis.Service.v4
 {
     class InsertUpdateCase : CamperUpdates
     {
         public void ProcessInsertUpdateCase(ref Msc.Integration.MessageBroker.Library.v4.Broker aobjBroker, ref System.Xml.XmlDocument aobjXmlInputDoc, ref Microsoft.VisualBasic.Collection aobjInstantiatedObjectsCollection, XmlNode aobjxmNotificationEventNode)
         /// <summary>
         /// </summary>
         /// <param name="objxmlBasePartyNode"></param>
         /// <param name="objxmlCasePartyNode"></param>
         /// <param name="objxmlBasePartyAddressNode"></param>
         /// <param name="objCaseParty"></param>
         protected void GetParty(ref XmlNode objxmlBasePartyNode, XmlNode objxmlCasePartyNode, ref XmlNode objxmlBasePartyAddressNode, ref ConservatorService.CaseParty objCaseParty, string astrDescription)
         {        
             objCaseParty.PartyId = objxmlBasePartyNode.SelectSingleNode("@ID").InnerText;
             objCaseParty.PartyType = (ConservatorService.MncisPartyTypes)Enum.Parse(typeof(ConservatorService.MncisPartyTypes), astrDescription);
             Boolean blnPhoneFound = false;
             XmlNode objxmlPhoneNode = objxmlBasePartyNode.SelectSingleNode("电话[@ Current ='true']");
             if (objxmlPhoneNode != null)
             {
                 objCaseParty.Phone = new ConservatorService.Phone();
                 if (objxmlPhoneNode.SelectSingleNode("Type").InnerText == "Home")
                 {
                     objCaseParty.Phone.Type = ConservatorService.PhoneNumberTypes.Home;
                     blnPhoneFound = 真正;
                 }
                 else //Cell
                 {
                     if (objxmlPhoneNode.SelectSingleNode("Type").InnerText == "Cell")
                     {
                         objCaseParty.Phone.Type = ConservatorService.PhoneNumberTypes.Cell;
                         blnPhoneFound = 真正;
                     }
                     else //Work
                     {
                         if (objxmlPhoneNode.SelectSingleNode("Type").InnerText == "Work")
                         {
                             objCaseParty.Phone.Type = ConservatorService.PhoneNumberTypes.Work;
                             blnPhoneFound = 真正;
                         }
                         else //Fax
                         {
                             if (objxmlPhoneNode.SelectSingleNode("Type").InnerText == "Fax")
                             {
                                 objCaseParty.Phone.Type = ConservatorService.PhoneNumberTypes.Fax;
                                 blnPhoneFound = 真正;
                             }
                         } //Fax
                     } //Work
                 } // 细胞
                 if (blnPhoneFound)
                 {
                     if (objxmlPhoneNode.SelectSingleNode("Extension") != null)
                     {
                         string strExtension = objxmlPhoneNode.SelectSingleNode("Extension").InnerText;
                         objCaseParty.Phone.Extention = strExtension;
                     }
                     if (objxmlPhoneNode.SelectSingleNode("Number") != null)
                     {
                         string strNumber = objxmlPhoneNode.SelectSingleNode("Number").InnerText;
                         objCaseParty.Phone.Number = strNumber;
                     }
                 }
             } //Phone Current 
        
         }
     }
 }
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,028
地点
挪威
编程经验
10+
我想我会使用这样的Xpath表达式:
// 电话 [@ Current ='true'和Type / @ Word ='HOME']

and go through the @Word options in order until a node was returned. When you have a 电话 node you can get /数 and /类型 from that.
 

莫莫克什

会员
已加入
2016年12月13日
留言内容
12
编程经验
1-3
如何依次处理@Word选项,直到返回节点以从中获取编号和类型?我尝试了这条路,但是当没有 // 电话 [@ Current ='true'和Type / @ Word ='HOME'] 在xml中,什么也不返回。在这种情况下,应该使用 // 电话 [@ Current ='true'和Type / @ Word ='CELL' 应该是返回的数字。如果不存在,则使用 // 电话 [@ Current ='true'和Type / @ Word ='WORK'
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,028
地点
挪威
编程经验
10+
我尝试了路径,但是当在XML中没有// 电话 [@ Current ='true'和Type / @ Word ='HOME']时
显然有:
<Phone Current="true">
<Type Word="HOME">Home</Type>
<Number>218-300-0011</Number>
</Phone>
XmlNode objxmlPhoneNode = objxmlBasePartyNode.SelectSingleNode("电话[@ Current ='true']");
您是否将此xpath更改为我的示例?
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,028
地点
挪威
编程经验
10+
好的,也许我误解了您的最后一篇文章:
如果xml中没有.. @ Word ='HOME'...,则不会返回任何内容
是的,就是这样。您检查返回的值是否为null,如果是这种情况,请继续执行下一个xpath,其中@ Word ='CELL'。
当返回值不为null时,您将具有一个Phone节点,可以查询Number(和Type)。
 

莫莫克什

会员
已加入
2016年12月13日
留言内容
12
编程经验
1-3
是的,我确实将路径更改为您的建议。我的意思是,我不希望该传真号码退回
<Phone Current="true">
<Type Word="FAX">Fax</Type>
<Number>218-777-7777 </Number>
</Phone>

测试时,我将<Type Word="HOME">Home</Type>从XML文档,我应该得到工作类型<Type Word="CELL">Cell</Type>因为它有电流。但是我没有得到它返回。什么也没退
<Phone Current="true">
<Type Word="HOME">Home</Type>
<Number>218-300-0011</Number>
</Phone>

<Phone Current="true">
<Type Word="HOME">Home</Type>
<Number>218-300-0011</Number>
</Phone><Phone Current="true">
<Type Word="HOME">Home</Type>
<Number>218-300-0011</Number>
</Phone><><Phone Current="true">
<Type Word="HOME">Home</Type>
<Number>218-300-0011</Number>
</Phone>
 
Last edited:

莫莫克什

会员
已加入
2016年12月13日
留言内容
12
编程经验
1-3
我已经在检查null If(objxmlPhoneNode!= null){
我仍然得到传真类型,因为它是xml文档中电话节点的第一个元素。但是我想把电话类型带回家。无论节点在xml文档中的何处,返回的数字都应为家庭类型。
And if home type with Current is not found, then I want to return 细胞 type. When I test without home type, nothing is returned.


 
Last edited:

莫莫克什

会员
已加入
2016年12月13日
留言内容
12
编程经验
1-3
电话元素在xml中出现的顺序并不重要。重要的是,无论电话类型Home元素在xml中位于何处,这都是我要显示的号码,除非不存在该号码,在这种情况下,我将显示Cell,如果不存在,则显示工作,是否显示不存在,将传真显示为最后一个选项。
My code is only displaying the first element of phone type which has phone/@Current='true' which in my XML格式 文件 is 传真. I do not want to display 传真 number because there is 首页 number
如何从逻辑上讲,选择Current等于true的所有节点,然后按Type对这些项目进行排序(选择其中的第一个就是我所需要的)。听起来很简单,但是我不确定代码中的更改方式或内容。这样,即使找到了其他电话类型,我也只希望显示找到的电话类型家庭电话号码。如果找不到电话类型“家庭”,那么我想显示电话类型“手机号码”,如果找不到,我想显示电话类型“工作号码”,如果找不到以上所有内容,那么我想显示电话类型“传真号码”。
这是我期望的输出
<Phone>
<Number>218-300-0011</Number>
<Type>Home</Type>
</Phone>
 
Last edited:
最佳 底部