2010-07-16 56 views
1

我找不到任何關於此的信息。我有一個從表單觸發的CRM標註,我需要附加到其中一個字段;例如,該字段可能有「BH」之類的內容,並且我需要標註進行一些計算並更改字段,以便它讀取「BH002129」或其他內容,但無論我如何嘗試,結果都只是完全覆蓋該字段(所以在這種情況下,它只會說「002129」)。我似乎無法得到它追加,我也無法弄清楚如何讀取該屬性的值,所以我可以將它粘貼到標註放在那裏的字符串。必須有一種方法來做到這一點,對吧?但是如何?如何將附加到CRM標註中的表單上的字段?

編輯:代碼片段:


public override PreCalloutReturnValue PreCreate(CalloutUserContext userContext, CalloutEntityContext entityContext, ref string entityXml, ref string errorMessage) 
    { 
    // Variables 
    string prefix = "no_init"; 

    XmlDocument entityDoc = new XmlDocument(); 
    entityDoc.LoadXml(entityXml); 

    XmlNodeList propertyList = entityDoc.GetElementsByTagName("Property"); 
    XmlElement competitorNumberValue = null; 
    XmlElement properties = (XmlElement) entityDoc.GetElementsByTagName("Properties")[0]; 
    XmlElement competitorNumberElement = entityDoc.CreateElement("Property"); 

    // Find prefix -- this is the part I don't know how to do 
    prefix = Convert.ToString(?????); 

      /* 
       Other stuff gets calculated here, which works fine. New value gets written to the attribute here as well. 
      */ 

    return PreCalloutReturnValue.Continue; 
    }

另一個編輯:我只是想這樣的想法,這是我在網上找到了和這實際上造成了一個CRM服務器錯誤保存:



      string nameSpaceValue = entityDoc.ChildNodes[0].Attributes["xmlns"].Value; 
      XmlNamespaceManager xsn = new XmlNamespaceManager(entityDoc.NameTable); 
      xsn.AddNamespace("z", nameSpaceValue); 
      string entityXpath = "//z:new_name"; 
      XmlNode new_nameNode = entityDoc.SelectSingleNode(entityXpath, xsn); 

      // Find prefix 
      prefix = ((XmlElement)new_nameNode).GetAttribute("new_name").ToString(); 
+0

你能發佈您的代碼?這是完全可能的,但很難看出你可能做錯了沒有一個例子。 – Matt 2010-07-16 19:08:38

+0

嗯,我不知道自己做錯了什麼,不知道如何做到這一點,但我會在一秒內用適當的代碼片段更新我的問題。 – extarbags 2010-07-16 19:10:23

回答

1

我使用這個類的工作WITN標註實體XML

public abstract class EntityXmlParser 
{ 
    public abstract bool isValueExists(params string[] arrParamName); 
    public abstract string GetSingleValue(string sParamName, string sDefaultValue); 
    public abstract int GetSingleValue(string sParamName, int nDefaultValue); 
    public abstract decimal GetSingleValue(string sParamName, decimal nDefaultValue); 
    public abstract Guid GetSingleValue(string sParamName, Guid idDefaultValue); 
    public abstract DateTime GetSingleValue(string sParamName, DateTime dtDefaultValue); 
} 

public class EntityCrmCalloutXmlParser : EntityXmlParser 
{ 
    private XmlDocument m_xmlDoc = null; 
    private NameTable m_xmlNameTable = null; 
    private XmlNamespaceManager m_xmlNameMgr = null; 
    private const string ms_sURIXmlns = @"http://schemas.microsoft.com/crm/2006/WebServices"; 
    private const string ms_sURIXsi = @"http://www.w3.org/2001/XMLSchema-instance"; 
    private bool m_blChangeEntityXml = false; 

public EntityCrmCalloutXmlParser(string sCalloutEntityXml) 
{ 
    /*m_xd = new XPathDocument(new System.IO.StringReader(sCalloutEntityXml)); 
    m_xn = m_xd.CreateNavigator();*/ 
    m_xmlNameTable = new NameTable(); 
    m_xmlNameMgr = new XmlNamespaceManager(m_xmlNameTable); 
    // Add the required prefix/namespace pairs to the namespace manager. Add a default namespace first. 
    m_xmlNameMgr.AddNamespace("crm", ms_sURIXmlns); 
    m_xmlNameMgr.AddNamespace("xsi", ms_sURIXsi); 
    // загрузка xml-строки 
    m_xmlDoc = new XmlDocument(); 
    m_xmlDoc.LoadXml(sCalloutEntityXml); 
} 

public string EntityXml 
{ 
    get { return m_xmlDoc.OuterXml; } 
} 

public bool IsChangeEntityXml 
{ 
    get { return m_blChangeEntityXml; } 
} 

public string GetEntityName() 
{ 
    XmlNodeList xmllstItem = m_xmlDoc.SelectNodes("/crm:BusinessEntity/@Name", m_xmlNameMgr); 
    if ((null == xmllstItem) || (1 != xmllstItem.Count)) 
     throw new CrmInternalException("Название сущности не найдено."); 
    return xmllstItem[0].InnerText; 
} 

public override string GetSingleValue(string sParamName, string sDefaultValue) 
{ 
    XmlNodeList xiter = m_xmlDoc.SelectNodes("//crm:Property[@Name='" + sParamName + "']/crm:Value", m_xmlNameMgr); 
    if (0 == xiter.Count) 
     return sDefaultValue; 
    if ((1 != xiter.Count) /* || !xiter.MoveNext()*/) 
     throw new System.ApplicationException("Ошибка при разборе входных значений. Неудалось однозначно определить параметр '" + sParamName + "'."); 
    // проверка на значение null. 
    XmlAttribute xmlIsNullAttribute = xiter.Item(0).Attributes["IsNull"]; 
    bool blNull = false; 
    if (null != xmlIsNullAttribute) 
     blNull = bool.Parse(xiter.Item(0).Attributes["IsNull"].Value); 
    return (blNull) ? sDefaultValue : xiter.Item(0).InnerText; 
} 
public override Guid GetSingleValue(string sParamName, Guid idDefaultValue) 
{ 
    return new Guid(GetSingleValue(sParamName, idDefaultValue.ToString("B"))); 
} 

public override decimal GetSingleValue(string sParamName, decimal nDefaultValue) 
{ 
    return decimal.Parse(GetSingleValue(sParamName, nDefaultValue.ToString(CalloutManager.Instance.NumberFormatInfo)), CalloutManager.Instance.NumberFormatInfo); 
} 

public override int GetSingleValue(string sParamName, int nDefaultValue) 
{ 
    return int.Parse(GetSingleValue(sParamName, nDefaultValue.ToString())); 
} 

public override DateTime GetSingleValue(string sParamName, DateTime dtDefaultValue) 
{ 
    return DateTime.Parse(GetSingleValue(sParamName, dtDefaultValue.ToString(CalloutManager.Instance.CRMFullDateFormat))); 
} 

    public bool SetPropertyValue(string sPropertyName, DateTime dtPropertyValue) 
    { 
     XmlNode xmlRootPropNode = m_xmlDoc.SelectSingleNode("crm:BusinessEntity/crm:Properties", m_xmlNameMgr); 
     if (null == xmlRootPropNode) 
      throw new ApplicationException("Ошибка при получении xml элемента BusinessEntity."); 
     // поиск элемента в xml-структуре 
     XmlElement xmlPropValueElem = (XmlElement)xmlRootPropNode.SelectSingleNode("crm:Property[@Name='" + sPropertyName + @"']/crm:Value", m_xmlNameMgr); 
     if (null == xmlPropValueElem) 
     { // элемент не найден 
      // создание элемента 
      XmlElement xmlPropElem = (XmlElement)xmlRootPropNode.AppendChild(m_xmlDoc.CreateElement("Property", ms_sURIXmlns)); 
      xmlPropElem.SetAttribute("type", ms_sURIXsi, "CrmDateTimeProperty"); 
      xmlPropElem.SetAttribute("Name", sPropertyName); 
      xmlPropValueElem = (XmlElement)xmlPropElem.AppendChild(m_xmlDoc.CreateElement("Value", ms_sURIXmlns)); 
     } 
     if (DateTime.MinValue.Equals(dtPropertyValue)) 
      xmlPropValueElem.SetAttribute("IsNull", string.Empty, "true"); 
     else 
      xmlPropValueElem.InnerText = dtPropertyValue.ToString("s"); 

     m_blChangeEntityXml = true; 
     return true; 
    } 


    public bool SetPropertyValue(string sPropertyName, string sPropertyValue) 
    { 
     XmlNode xmlRootPropNode = m_xmlDoc.SelectSingleNode("crm:BusinessEntity/crm:Properties", m_xmlNameMgr); 
     if (null == xmlRootPropNode) 
      throw new ApplicationException("Ошибка при получении xml элемента BusinessEntity."); 
     // поиск элемента в xml-структуре 
     XmlElement xmlPropValueElem = (XmlElement)xmlRootPropNode.SelectSingleNode("crm:Property[@Name='" + sPropertyName + @"']/crm:Value", m_xmlNameMgr); 
     if (null == xmlPropValueElem) 
     { // элемент не найден 
      // создание элемента 
      XmlElement xmlPropElem = (XmlElement)xmlRootPropNode.AppendChild(m_xmlDoc.CreateElement("Property", ms_sURIXmlns)); 
      xmlPropElem.SetAttribute("type", ms_sURIXsi, "StringProperty"); 
      xmlPropElem.SetAttribute("Name", sPropertyName); 
      xmlPropValueElem = (XmlElement)xmlPropElem.AppendChild(m_xmlDoc.CreateElement("Value", ms_sURIXmlns)); 
     } 
     xmlPropValueElem.InnerText = sPropertyValue; 
     m_blChangeEntityXml = true; 
     return true; 
    } 

    public bool SetPropertyValue(string sPropertyName, Guid idPropertyValue) 
    { 
     XmlNode xmlRootPropNode = m_xmlDoc.SelectSingleNode("crm:BusinessEntity/crm:Properties", m_xmlNameMgr); 
     if (null == xmlRootPropNode) 
      throw new CrmInternalException("Ошибка при получении xml элемента BusinessEntity."); 
     // поиск элемента в xml-структуре 
     XmlElement xmlPropValueElem = (XmlElement)xmlRootPropNode.SelectSingleNode("crm:Property[@Name='" + sPropertyName + @"']/crm:Value", m_xmlNameMgr); 
     if (null == xmlPropValueElem) 
     { // элемент не найден 
      // создание элемента 
      XmlElement xmlPropElem = (XmlElement)xmlRootPropNode.AppendChild(m_xmlDoc.CreateElement("Property", ms_sURIXmlns)); 
      xmlPropElem.SetAttribute("type", ms_sURIXsi, "LookupProperty"); 
      xmlPropElem.SetAttribute("Name", sPropertyName); 
      xmlPropValueElem = (XmlElement)xmlPropElem.AppendChild(m_xmlDoc.CreateElement("Value", ms_sURIXmlns)); 
     } 
     if (idPropertyValue.Equals(Guid.Empty)) 
      xmlPropValueElem.SetAttribute("IsNull", string.Empty, "true"); 
     else 
      xmlPropValueElem.InnerText = idPropertyValue.ToString("B"); 
     m_blChangeEntityXml = true; 
     return true; 
    } 

    public bool SetPropertyValue(string sPropertyName, int nPropertyValue) 
    { 
     XmlNode xmlRootPropNode = m_xmlDoc.SelectSingleNode("crm:BusinessEntity/crm:Properties", m_xmlNameMgr); 
     if (null == xmlRootPropNode) 
      throw new CrmInternalException("Ошибка при получении xml элемента BusinessEntity."); 
     // поиск элемента в xml-структуре 
     XmlElement xmlPropValueElem = (XmlElement)xmlRootPropNode.SelectSingleNode("crm:Property[@Name='" + sPropertyName + @"']/crm:Value", m_xmlNameMgr); 
     if (null == xmlPropValueElem) 
     { // элемент не найден 
      // создание элемента 
      XmlElement xmlPropElem = (XmlElement)xmlRootPropNode.AppendChild(m_xmlDoc.CreateElement("Property", ms_sURIXmlns)); 
      xmlPropElem.SetAttribute("type", ms_sURIXsi, "CrmNumberProperty"); 
      xmlPropElem.SetAttribute("Name", sPropertyName); 
      xmlPropValueElem = (XmlElement)xmlPropElem.AppendChild(m_xmlDoc.CreateElement("Value", ms_sURIXmlns)); 
     } 
     xmlPropValueElem.InnerText = nPropertyValue.ToString(); 
     m_blChangeEntityXml = true; 
     return true; 
    } 

    public bool SetPropertyValue(string sPropertyName, decimal dPropertyValue) 
    { 
     XmlNode xmlRootPropNode = m_xmlDoc.SelectSingleNode("crm:BusinessEntity/crm:Properties", m_xmlNameMgr); 
     if (null == xmlRootPropNode) 
      throw new CrmInternalException("Ошибка при получении xml элемента BusinessEntity."); 
     // поиск элемента в xml-структуре 
     XmlElement xmlPropValueElem = (XmlElement)xmlRootPropNode.SelectSingleNode("crm:Property[@Name='" + sPropertyName + @"']/crm:Value", m_xmlNameMgr); 
     if (null == xmlPropValueElem) 
     { // элемент не найден 
      // создание элемента 
      XmlElement xmlPropElem = (XmlElement)xmlRootPropNode.AppendChild(m_xmlDoc.CreateElement("Property", ms_sURIXmlns)); 
      xmlPropElem.SetAttribute("type", ms_sURIXsi, "CrmMoneyProperty"); 
      xmlPropElem.SetAttribute("Name", sPropertyName); 
      xmlPropValueElem = (XmlElement)xmlPropElem.AppendChild(m_xmlDoc.CreateElement("Value", ms_sURIXmlns)); 
     } 
     xmlPropValueElem.InnerText = dPropertyValue.ToString(System.Globalization.CultureInfo.InvariantCulture); 
     m_blChangeEntityXml = true; 
     return true; 
    } 

} 

}

相關問題