Skip to content

Instantly share code, notes, and snippets.

@souri-t
Created April 14, 2023 12:55
Show Gist options
  • Save souri-t/a155d9bea36f130024481bba670dc8ac to your computer and use it in GitHub Desktop.
Save souri-t/a155d9bea36f130024481bba670dc8ac to your computer and use it in GitHub Desktop.

要素数が増減する場合は、以下のようにして処理を行うことができます。

[HttpPut("{id}")]
public async Task<IActionResult> Put(int id, [FromBody] Parent parent)
{
    if (id != parent.Id)
    {
        return BadRequest();
    }

    var existingParent = await _context.Parents
        .Include(p => p.Children)
        .SingleOrDefaultAsync(p => p.Id == id);

    if (existingParent == null)
    {
        return NotFound();
    }

    existingParent.Name = parent.Name;

    // 子データの更新
    var updatedChildren = new List<Child>();
    foreach (var child in parent.Children)
    {
        if (child.Id == 0)
        {
            // 新しい子データを追加する場合
            var newChild = new Child
            {
                Name = child.Name,
                ParentId = parent.Id
            };
            updatedChildren.Add(newChild);
        }
        else
        {
            // 既存の子データを更新する場合
            var existingChild = existingParent.Children.SingleOrDefault(c => c.Id == child.Id);
            if (existingChild == null)
            {
                return NotFound();
            }
            existingChild.Name = child.Name;
            updatedChildren.Add(existingChild);
        }
    }

    // 削除された子データを検出する
    var deletedChildren = existingParent.Children.Where(c => !updatedChildren.Any(uc => uc.Id == c.Id)).ToList();
    foreach (var deletedChild in deletedChildren)
    {
        existingParent.Children.Remove(deletedChild);
    }

    // 新しい子データを追加する
    foreach (var newChild in updatedChildren.Where(c => c.Id == 0))
    {
        existingParent.Children.Add(newChild);
    }

    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ParentExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return NoContent();
}

上記の例では、子データの更新処理に加えて、削除された子データと追加された子データを検出して、それぞれの処理を行っています。削除された子データは、更新された子データのリストに含まれていない既存の子データとして検出されます。これらの子データを検出した後、親クラスのChildrenプロパティからこれらの子データを削除します。一方、追加された子データは、更新された子データのリストに含まれているが、親クラスのChildrenプロパティには含まれていない子データとして検出されます。これらの子データを検出した後、親クラスのChildrenプロパティにこれらの子データを追加します。

@souri-t
Copy link
Author

souri-t commented Nov 4, 2023

`
import { XMLParser } from 'fast-xml-parser';
import { useEffect, useState } from 'react';
import fs from 'fs';

export const MyComponent = () => {

async function loadXMLFile(filePath: string): Promise<string> {
    const response = await fetch(filePath);
    const data = await response.text();
    return data;
}
function readXmlFile(filePath: string): string {
    return fs.readFileSync(filePath, 'utf8');
}

const [xmlData, setXmlData] = useState<string>('');

useEffect(() => {
    const loadData = async () => {
        const data = await loadXMLFile("./src/examples/Components/XmlData.xml");
        setXmlData(data);
    };
    loadData();
}, []);

const xml = new XMLParser().parse(xmlData)    // Assume xmlText contains the example XML
console.log(xml);

return (
    // XMLデータを表示します
    // ...
    <>{xmlData}</>
);

};

`

@souri-t
Copy link
Author

souri-t commented Nov 4, 2023


<?xml version='1.0' encoding='utf-8'?>
<Library>
   <Books count='1'>
       <Book id='1'>
           <Name>Me Before You</Name>
           <Author>Jojo Moyes</Author>
       </Book>
   </Books>
   <Music count=1>
       <CD id='2'>
           <Name>Houses of the Holy</Name>
           <Artist>Led Zeppelin</Artist>
       </CD>
   </Music>
</Library>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment