当前位置: 首页 > 知识库问答 >
问题:

我应该将XML声明存储在数据库中并使用WebApi返回吗

黄泰宁
2023-03-14
public async IActionResult Post([FromBody]XDocument xml)
{
   var entity = new MyDocument();
   entity.Xml = xml.ToString(); //?? 
   db.Documents.Add(entity);
   db.SaveChanges();
   return Created();
}

public async Task<IActionResult> Get(int id)
{
   var entity = db.Documents.Find(id);
   return Content(entity.Xml, "application/xml"); //missing xml declaration
}
var xml = XDocument.Load(@"<?xml version=""1.0"" encoding=""utf-8""?>
                           <Root><Child>Content</Child></Root>");
xml.ToString(); //<Root><Child>Content</Child></Root>

很容易包括它,但我认为这可能是有原因的。

当响应不包括XML声明时,Edge浏览器不显示XML:

public IActionResult Get()
{
    return Content("<Root><Child>Content</Child></Root>", "application/xml")
}

当响应包含xml声明,但声明中的编码与响应编码不匹配时,它也会以“无法切换编码”而失败:

public IActionResult Get()
{
    return Content(@"<?xml version=""1.0"" encoding=""utf-8""?>
                     <Root><Child>Content</Child></Root>", "application/xml");
}
public IActionResult Get()
{
    string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
                   <Root><Child>Content</Child></Root>")
    var xmlDoc = XDocument.Parse(xml);
    return Content(xml, "application/xml", Encoding.GetEncoding(xmlDoc.Declaration.Encoding));
}

共有1个答案

常小白
2023-03-14

我将这些规则确定为最佳实践:

>

  • 不应将XML编码存储在数据库中

    • 声明是可选的,但如果存在,则不能包括编码
      null

    很明显,您不想将编码存储在数据库中,因为数据库本身就威胁到XML列。但是,将XML声明存储在数据库中是有意义的,因为它可以包含其他信息(版本、独立)。

    您的REST服务应该始终在响应中返回XML声明。如果它不存储在数据库中,您可以在运行时构造它。

    public async IActionResult Post([FromBody]XDocument xml)
    {
       var entity = new MyDocument();
       var declarationWithoutEncoding = new XDeclaration(xml.Declaration?.Version, null, xml.Declaration?.Standalone);
       entity.Xml = $@"{declarationWithoutEncoding}\n\r{xml.ToString()}"
       db.Documents.Add(entity);
       db.SaveChanges();
       return Created();
    }
    
    public async Task<IActionResult> Get(int id)
    {
       var entity = db.Documents.Find(id);
       return Content(entity.Xml, "application/xml"); //in case XML Declaration is in database
    }
    

    或者

    public async Task<IActionResult> Get(int id)
    {
       var entity = db.Documents.Find(id);
       XDocument xmlDoc = XDocument.Parse(entity.xml);
    
       var declaration = new XDeclaration(xml.Declaration?.Version ?? "1.0", null, xml.Declaration?.Standalone ? "no");
    
       //you may change enccoding information to match response encoding, or just skip it
       //declaration.Encoding = ...
    
       string xml = $@"{declaration}\n\r{xml.ToString()}"
    
       return Content(xml, "application/xml"); 
    }
    

  •  类似资料:
    • 数据是非常小的,就像水果的列表,不会经常改变,也只有一个服务将使用这个数据和服务到其他服务,请提到您的方法的优点和缺点。

    • 问题内容: 默认情况下,Python 3对源代码文件使用UTF-8编码。我仍应在每个源文件的开头使用编码声明吗?喜欢 问题答案: 因为默认 值为 UTF-8,所以仅在偏离默认值时或者在依赖其他工具(例如IDE或文本编辑器)来使用该信息时,才需要使用该声明。 换句话说, 就Python而言 ,仅当您要使用不同的编码时,才需要使用该声明。 其他工具(例如您的编辑器)也可以支持类似的语法,这就是PEP

    • 我在这里试图得到两个非常相似的问题的答案: 我是否应该在存储库对象中将实体转换为DTO,并将其返回到服务层? 其中是一个注释类-这似乎是我不应该做的第一件事,因为服务层现在知道了一个非常低级别的对象,它违反了在每一层抽象数据的尝试。 如果我将每个转换为,情况就不是这样了--但是我应该这样做吗? 基本改变: 但这对我来说不是最好的解决办法…我在这里能做什么? 要提到的一件重要事情是,它来自GWT项目

    • 我目前正在构建一个项目,其中我需要为每个用户保存一个字符串列表(他阅读的文章的网址)。 我正在使用带有sqlite的python烧瓶SQLalchemy。 我知道sqlite不支持数组,所以我正在考虑切换到另一个数据库,而不是sqlite,一个支持数组的数据库。 我想知道你会怎么做?哪个数据库支持数组,或者是否有更好的解决方法。

    • 我创建了一个TextView,它以多行显示值 ,我希望将该值保留在SQLite数据库中。这是我使用的代码: 问题是当我保存值时,整个值被插入到一个单元格中。我希望每行的值分开,然后插入到每行的单个单元格中,尽管我使用扫描器方法插入数据,但它不起作用。那有什么办法吗?

    • 问题内容: 我正在使用ExpressJS,Mongodb(Mogoose)构建应用程序。应用程序包含访问用户之前必须对其进行身份验证的路由。 目前,我已经编写了一个快速的中间件来做同样的事情。在这里,借助JWT令牌,我正在进行mongodb查询以检查用户是否已通过身份验证。但是感觉这可能会在我的数据库上增加不必要的请求负载。 我应该针对此特定任务集成redis吗? 会改善API性能吗?还是应该继续