顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

2020年4月9日 星期四

[C#]XML 相關操作

最近因為開發某個功能需要跟別的系統介接
發現對方的存取都是透過XML string
最方便的方法就是透過string直接做處理
但是一下轉string,一下轉XMLElement
如果資料的數量多,難免會影響效能

後來想了,如果一開始就透過XDocument做處理
是不是可以省去轉string或XML Element的步驟
找了網路上的方法,整理會用到的功能
有新增欄位、刪除欄位、變更tag名稱


static void Main(string[] args) {
 XElement bookElement = new XElement("book");
 XDocument doc = new XDocument(bookElement);

 AddElement(ref doc, "author", "Gambardella, Matthew");
 AddElement(ref doc, "title", "XML Developer's Guide");
 AddElement(ref doc, "genre", "Computer");
 AddElement(ref doc, "price", 44.95);
 AddElement(ref doc, "publish_date", new DateTime(2000, 1, 1));
 AddElement(ref doc, "description", "An in-depth look at creating applications with XML.");
 Console.WriteLine(doc.ToString());

 ReplaceTagName(ref doc, "description", "memo");
 Console.WriteLine(doc.ToString());

 RemoveElement(ref doc, "genre");
 Console.WriteLine(doc.ToString());
}


// 更換xml的tag name
public static void ReplaceTagName(ref XDocument doc, string origTagName, string newTagName) {
 foreach (var element in doc.Descendants()) {
  if (element.Name.LocalName.Equals(origTagName)) {
   element.Name = newTagName;
  }
 }
}

// 新增欄位
public static void AddElement(ref XDocument doc, string elementName, object elementValue) {
 try {
  doc.Root.Add(new XElement(elementName, elementValue));
 } catch (Exception e) {
  Console.WriteLine("AddElement error:" + doc.ToString() + Environment.NewLine + e.StackTrace);
 }
}

// 移除欄位
public static void RemoveElement(ref XDocument doc, string elementName) {
 try {
  doc.Descendants().SingleOrDefault(p => p.Name == elementName).Remove();
 } catch (Exception e) {
  Console.WriteLine("RemoveElement error:" + doc.ToString() + Environment.NewLine + e.StackTrace);
 }
}



如果想把XML直接轉成class
Visual Studio有支援可以把XML或JSON轉成 class
路徑: Edit -> Paste Special -> Paste XML As Classes 
轉完之後,再查看一下欄位的格式是否是想要的
有了class可以少去一個欄位一個欄位對應轉換成XML

產生的XML string驗證是否正確
可以透過以下兩個網頁來檢驗
1. https://www.freeformatter.com/xml-formatter.html#ad-output
2. https://codebeautify.org/xmlvalidator

2019年1月9日 星期三

Build Classic Asp Environment in Winsdows10

因為專案有些是舊的asp程式
找了一些資料怎麼建置asp的環境
後來照這篇試出來可以跑,參考

---------------------------------------------------------------------
過了三個月後再回來看這篇,一開始設不成功
後來照著Ref的連結去設定,不確定是不是最後這步
設定完成後,應該classic asp程式就可以開啟

1.IIS -> ASP


2.將這兩個選項設為True
啟用上層路徑            -> True
將錯誤傳送到瀏覽器 -> True




Ref:
https://www.codeproject.com/Articles/43132/How-to-Setup-IIS-on-Windows-to-Allow-Classic

2018年12月24日 星期一

[C#][Json]讀Json處理小數點

讀JSON檔的時候,有些有小數的欄位太長
想去掉小數點,可以在Entity上面加converter
透過converter,取到的資料已經做好處理
參考範例如下

public class TestEntity {
    [JsonConverter(typeof(CustomDecimalNullConverter))]
    public decimal val {get; set;}
}


void Main() {   
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new CustomDecimalNullConverter());
    var result = JsonConvert.DeserializeObject>(json, settings);
}

// For completeness: A stupid example converter
class CustomDecimalNullConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(decimal);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            return 0m;
        }
        else
        {
            return Convert.ToDecimal(reader.Value);
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue((decimal)value);
    }
}

Ref: https://stackoverflow.com/questions/51885268/custom-rule-for-deserializing-decimal-values-in-json-net