解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# XML ÐòÁл¯
## ¸ÅÊö
NewLife.Core ÌṩÁËÁé»îµÄ XML ÐòÁл¯ºÍ·´ÐòÁл¯¹¦ÄÜ£¬Í¨¹ý `XmlHelper` À©Õ¹·½·¨¿ÉÒÔ·½±ãµØ½øÐжÔÏóÓë XML µÄת»»¡£Ö§³Ö×Ô¶¯Ìí¼Ó×¢ÊÍ¡¢ÊôÐÔģʽÊä³öµÈÌØÐÔ£¬ÌرðÊʺÏÅäÖÃÎļþ³¡¾°¡£
**ÃüÃû¿Õ¼ä**£º`NewLife.Xml`£¨À©Õ¹·½·¨£©¡¢`NewLife.Serialization`£¨ºËÐÄʵÏÖ£©
**ÎĵµµØÖ·**£ºhttps://newlifex.com/core/xml
## ºËÐÄÌØÐÔ
- **¼ò½à API**£º`ToXml()` ºÍ `ToXmlEntity<T>()` À©Õ¹·½·¨
- **×¢ÊÍÖ§³Ö**£º×Ô¶¯¸½¼Ó `Description` ºÍ `DisplayName` ÌØÐÔ×÷ΪעÊÍ
- **ÊôÐÔģʽ**£º¿ÉÑ¡Ôñ½«ÊôÐÔÐòÁл¯Îª XML ÊôÐÔ¶ø·ÇÔªËØ
- **±àÂë¿ØÖÆ**£ºÖ§³ÖÖ¸¶¨±àÂë¸ñʽ
- **Îļþ²Ù×÷**£ºÖ±½ÓÐòÁл¯µ½Îļþ»ò´ÓÎļþ·´ÐòÁл¯
## ¿ìËÙ¿ªÊ¼
### ÐòÁл¯
```csharp
using NewLife.Xml;
public class AppConfig
{
public String Name { get; set; }
public Int32 Port { get; set; }
public Boolean Debug { get; set; }
}
var config = new AppConfig
{
Name = "MyApp",
Port = 8080,
Debug = true
};
// ÐòÁл¯Îª XML ×Ö·û´®
var xml = config.ToXml();
```
**Êä³ö**£º
```xml
<?xml version="1.0" encoding="utf-8"?>
<AppConfig>
<Name>MyApp</Name>
<Port>8080</Port>
<Debug>true</Debug>
</AppConfig>
```
### ·´ÐòÁл¯
```csharp
using NewLife.Xml;
var xml = """
<?xml version="1.0" encoding="utf-8"?>
<AppConfig>
<Name>MyApp</Name>
<Port>8080</Port>
<Debug>true</Debug>
</AppConfig>
""";
var config = xml.ToXmlEntity<AppConfig>();
Console.WriteLine(config.Name); // MyApp
```
## API ²Î¿¼
### ToXml - ÐòÁл¯
```csharp
// »ù´¡ÐòÁл¯
public static String ToXml(this Object obj, Encoding? encoding = null,
Boolean attachComment = false, Boolean useAttribute = false)
// ÍêÕû²ÎÊý
public static String ToXml(this Object obj, Encoding encoding,
Boolean attachComment, Boolean useAttribute, Boolean omitXmlDeclaration)
// ÐòÁл¯µ½Á÷
public static void ToXml(this Object obj, Stream stream, Encoding? encoding = null,
Boolean attachComment = false, Boolean useAttribute = false)
// ÐòÁл¯µ½Îļþ
public static void ToXmlFile(this Object obj, String file, Encoding? encoding = null,
Boolean attachComment = true)
```
**²ÎÊý˵Ã÷**£º
- `encoding`£º±àÂë¸ñʽ£¬Ä¬ÈÏ UTF-8
- `attachComment`£ºÊÇ·ñ¸½¼Ó×¢ÊÍ£¨Ê¹Óà Description/DisplayName£©
- `useAttribute`£ºÊÇ·ñʹÓà XML ÊôÐÔģʽ
- `omitXmlDeclaration`£ºÊÇ·ñÊ¡ÂÔ XML ÉùÃ÷
### ToXmlEntity - ·´ÐòÁл¯
```csharp
// ´Ó×Ö·û´®·´ÐòÁл¯
public static TEntity? ToXmlEntity<TEntity>(this String xml) where TEntity : class
// ´ÓÁ÷·´ÐòÁл¯
public static TEntity? ToXmlEntity<TEntity>(this Stream stream, Encoding? encoding = null)
// ´ÓÎļþ·´ÐòÁл¯
public static TEntity? ToXmlFileEntity<TEntity>(this String file, Encoding? encoding = null)
```
## ʹÓó¡¾°
### 1. ÅäÖÃÎļþ
```csharp
using System.ComponentModel;
using NewLife.Xml;
public class DatabaseConfig
{
[Description("Êý¾Ý¿â·þÎñÆ÷µØÖ·")]
public String Server { get; set; } = "localhost";
[Description("Êý¾Ý¿â¶Ë¿Ú")]
public Int32 Port { get; set; } = 3306;
[Description("Êý¾Ý¿âÃû³Æ")]
public String Database { get; set; } = "mydb";
[Description("Óû§Ãû")]
public String User { get; set; } = "root";
[Description("Á¬½Ó³¬Ê±£¨Ã룩")]
public Int32 Timeout { get; set; } = 30;
}
// ±£´æÅäÖ㨴ø×¢ÊÍ£©
var config = new DatabaseConfig();
config.ToXmlFile("db.config", attachComment: true);
// ¼ÓÔØÅäÖÃ
var loaded = "db.config".ToXmlFileEntity<DatabaseConfig>();
```
**Éú³ÉµÄ XML**£º
```xml
<?xml version="1.0" encoding="utf-8"?>
<DatabaseConfig>
<!--Êý¾Ý¿â·þÎñÆ÷µØÖ·-->
<Server>localhost</Server>
<!--Êý¾Ý¿â¶Ë¿Ú-->
<Port>3306</Port>
<!--Êý¾Ý¿âÃû³Æ-->
<Database>mydb</Database>
<!--Óû§Ãû-->
<User>root</User>
<!--Á¬½Ó³¬Ê±£¨Ã룩-->
<Timeout>30</Timeout>
</DatabaseConfig>
```
### 2. ÊôÐÔģʽÊä³ö
```csharp
public class Item
{
public Int32 Id { get; set; }
public String Name { get; set; }
public Decimal Price { get; set; }
}
var item = new Item { Id = 1, Name = "ÉÌÆ·A", Price = 99.9M };
// ÔªËØÄ£Ê½£¨Ä¬ÈÏ£©
var xml1 = item.ToXml();
// <Item><Id>1</Id><Name>ÉÌÆ·A</Name><Price>99.9</Price></Item>
// ÊôÐÔģʽ
var xml2 = item.ToXml(useAttribute: true);
// <Item Id="1" Name="ÉÌÆ·A" Price="99.9" />
```
### 3. ¸´ÔÓ¶ÔÏó
```csharp
public class Order
{
public Int32 Id { get; set; }
public DateTime CreateTime { get; set; }
public Customer Customer { get; set; }
public List<OrderItem> Items { get; set; }
}
public class Customer
{
public String Name { get; set; }
public String Phone { get; set; }
}
public class OrderItem
{
public String ProductName { get; set; }
public Int32 Quantity { get; set; }
public Decimal Price { get; set; }
}
var order = new Order
{
Id = 1001,
CreateTime = DateTime.Now,
Customer = new Customer { Name = "ÕÅÈý", Phone = "13800138000" },
Items = new List<OrderItem>
{
new() { ProductName = "ÉÌÆ·A", Quantity = 2, Price = 50 },
new() { ProductName = "ÉÌÆ·B", Quantity = 1, Price = 100 }
}
};
var xml = order.ToXml();
```
### 4. Ê¡ÂÔ XML ÉùÃ÷
```csharp
// Ê¡ÂÔ <?xml version="1.0" encoding="utf-8"?>
var xml = obj.ToXml(Encoding.UTF8, false, false, true);
```
### 5. ×ÖµäÐòÁл¯
```csharp
// ×Ö·û´®×Öµä¿ÉÒÔÖ±½ÓÐòÁл¯
var dict = new Dictionary<String, String>
{
["Key1"] = "Value1",
["Key2"] = "Value2"
};
dict.ToXmlFile("settings.xml");
```
## Xml Àࣨ¸ß¼¶Ó÷¨£©
¶ÔÓÚÐèÒª¸ü¾«Ï¸¿ØÖƵij¡¾°£¬¿ÉÒÔÖ±½ÓʹÓà `Xml` Àࣺ
```csharp
using NewLife.Serialization;
// ÐòÁл¯
var xml = new Xml
{
Stream = stream,
Encoding = Encoding.UTF8,
UseAttribute = false,
UseComment = true,
EnumString = true // ö¾ÙʹÓÃ×Ö·û´®
};
xml.Write(obj);
// ·´ÐòÁл¯
var xml = new Xml
{
Stream = stream,
Encoding = Encoding.UTF8
};
var result = xml.Read(typeof(MyClass));
```
### Xml ÀàÊôÐÔ
```csharp
public class Xml
{
/// <summary>ʹÓÃÌØÐÔÊä³ö</summary>
public Boolean UseAttribute { get; set; }
/// <summary>ʹÓÃ×¢ÊÍ</summary>
public Boolean UseComment { get; set; }
/// <summary>ö¾ÙʹÓÃ×Ö·û´®¡£Ä¬ÈÏtrue</summary>
public Boolean EnumString { get; set; }
/// <summary>XMLдÈëÉèÖÃ</summary>
public XmlWriterSettings Setting { get; set; }
}
```
## ÌØÐÔÖ§³Ö
### XmlRoot - ¸ùÔªËØÃû³Æ
```csharp
[XmlRoot("config")]
public class AppConfig
{
public String Name { get; set; }
}
// Êä³ö <config><Name>...</Name></config>
```
### XmlElement - ÔªËØÃû³Æ
```csharp
public class User
{
[XmlElement("user_name")]
public String Name { get; set; }
}
```
### XmlAttribute - Êä³öΪÊôÐÔ
```csharp
public class Item
{
[XmlAttribute]
public Int32 Id { get; set; }
public String Name { get; set; }
}
// Êä³ö <Item Id="1"><Name>...</Name></Item>
```
### XmlIgnore - ºöÂÔ×Ö¶Î
```csharp
public class User
{
public String Name { get; set; }
[XmlIgnore]
public String Password { get; set; } // ²»ÐòÁл¯
}
```
## ×î¼Ñʵ¼ù
### 1. ÅäÖÃÎļþʹÓÃ×¢ÊÍ
```csharp
// ±£´æÊ±ÆôÓÃ×¢ÊÍ
config.ToXmlFile("app.config", attachComment: true);
// ʹÓà Description ÌØÐÔÌí¼Ó˵Ã÷
[Description("Ó¦ÓÃÃû³Æ£¬ÓÃÓÚÈÕÖ¾±êʶ")]
public String AppName { get; set; }
```
### 2. Îļþ²Ù×÷×¢ÒâÊÂÏî
```csharp
// ToXmlFile »á×Ô¶¯´´½¨Ä¿Â¼
config.ToXmlFile("Config/app.xml");
// ¼ì²éÎļþÊÇ·ñ´æÔÚ
if (File.Exists(file))
{
var config = file.ToXmlFileEntity<AppConfig>();
}
```
### 3. ±àÂëÒ»ÖÂÐÔ
```csharp
// ±£´æºÍ¼ÓÔØÊ¹ÓÃÏàͬ±àÂë
var encoding = Encoding.UTF8;
config.ToXmlFile("config.xml", encoding);
var loaded = "config.xml".ToXmlFileEntity<AppConfig>(encoding);
```
## Óë JSON ¶Ô±È
| ÌØÐÔ | XML | JSON |
|------|-----|------|
| ¿É¶ÁÐÔ | ´ø×¢Ê͸üÇåÎú | ¸ü½ô´Õ |
| Ìå»ý | ½Ï´ó | ½ÏС |
| ×¢ÊÍÖ§³Ö | ÔÉúÖ§³Ö | ²»Ö§³Ö |
| ÅäÖÃÎļþ | ? ÍÆ¼ö | ? ÊÊÓà |
| API Êý¾Ý | ? ²»ÍƼö | ? ÍÆ¼ö |
## Ïà¹ØÁ´½Ó
- [JSON ÐòÁл¯](/NewLife/X/Blob/dev/Doc/json-JSONÐòÁл¯.md)
- [ÅäÖÃϵͳ Config](/NewLife/X/Blob/dev/Doc/config-ÅäÖÃϵͳConfig.md)
- [¶þ½øÖÆÐòÁл¯ Binary](/NewLife/X/Blob/dev/Doc/binary-¶þ½øÖÆÐòÁл¯Binary.md)
|