2012-03-05 2 views
0

У меня есть небольшая часть xml-файла с именем «fragment.xml», который показан ниже, где каждый «SteamStuff» имеет свое собственное значение «AttributeValue». Здесь, если я нажму кнопку copy, мне нужно создать небольшой файл xml, содержащий только данные SteamStuff с именем «pirate». Для этого я создал форму окна, содержащую две кнопки с именем «Копировать» и «Вставить». Если я нажму кнопку «Копировать», она должна найти «fragment.xml», где он находится на моем ПК, и вам нужно найти управляемый объект с именем «pirate» (<Text>pirate</Text>), как только он найдет, будет найден связанный с ним ориентир <ID>b6792ed8-680b-4117-a695-9f7ef2c7752b</ID>, поэтому, если этот идентификатор появится, он должен выбрать и установить данные и создать небольшой xml-файл с именем «test.xml» в том же месте, что и «fragment.xml». Так test.xml содержит только ДАННЫЕ из «пиратских» Какой код я могу здесь реализовать в button1_Click() событиекак фильтровать базу данных xml на Id

<?xml version="1.0" standalone="yes"?> 
<LeafDataSchema xmlns="http://tempuri.org/LeafDataSchema.xsd"> 
    <SteamStuff> 
    <ID>b6792ed8-680b-4117-a695-9f7ef2c7752b</ID> 
    <Label>pirate</Label> 
    <Owner>00000000-0000-0000-0000-000000000000</Owner> 
    <Image>00000000-0000-0000-0000-000000000000</Image> 
    <ClassID>00000000-0000-0000-0000-000000000008</ClassID> 
    <DefaultApp>00000000-0000-0000-0000-000000000000</DefaultApp> 
    <Name>pirate</Name> 
    <Volatile>true</Volatile> 
    </SteamStuff> 

    <AttributeValue> 
    <ID>2977f4e0-84ab-4ad2-8c4d-6bcb49727889</ID> 
    <ObjectID>b6792ed8-680b-4117-a695-9f7ef2c7752b</ObjectID> 
    <Text>True</Text> 
    <AttributeName>Monitor</AttributeName> 
    <ClassID>00000000-0000-0000-0000-000000000008</ClassID> 
    </AttributeValue> 
------------- 
+0

@Chuck Savage SteamStuff является из , поэтому все свойства объекта SteamStuff будет отображаться в AttributeValue.here только мне нужно создать файл подмножество XML содержит только ДАННЫЕ пиратского – Henric

ответ

1

Используя эти XML-расширения: http://searisen.com/xmllib/extensions.wiki

Создание классов, потому что это делает его легче увидеть как это работает:

public class XFile 
{ 
    XElement self; 

    public XFile(string file) 
    { 
     self = XElement.Load(file); 
    } 

    public XNamespace Namespace 
    { 
     get { return _Namespace ?? (_Namespace = self.GetDefaultNamespace()); } 
    } 
    XNamespace _Namespace; 

    public AttributeValue[] AttributeValues 
    { 
     get 
     { 
      return _AttributeValues ?? 
       (_AttributeValues = self.GetEnumerable("AttributeValue", x => new AttributeValue(this, x)).ToArray()); 
     } 
    } 
    AttributeValue[] _AttributeValues; 

    public SteamStuff[] SteamStuffs 
    { 
     get 
     { 
      return _SteamStuffs ?? 
       (_SteamStuffs = self.GetEnumerable("SteamStuff", x => new SteamStuff(this, x)).ToArray()); 
     } 
    } 
    SteamStuff[] _SteamStuffs; 
} 

public class SteamStuff 
{ 
    XElement self; 
    XFile parent; 

    public SteamStuff(XFile parent, XElement self) 
    { 
     this.parent = parent; 
     this.self = self; 
    } 

    public XElement Element { get { return self; } } 

    public string ID 
    { 
     get { return self.Get("ID", string.Empty); } 
    } 

    public string Label 
    { 
     get { return self.Get("Label", string.Empty); } 
    } 
} 

public class AttributeValue 
{ 
    XElement self; 
    XFile parent; 

    public AttributeValue(XFile parent, XElement self) 
    { 
     this.parent = parent; 
     this.self = self; 
    } 

    public XElement Element { get { return self; } } 

    public string ObjectID 
    { 
     get { return self.Get("ObjectID", string.Empty); } 
    } 
} 

XFile xfile = new XFile("test.xml"); 
SteamStuff[] pirates = xfile.SteamStuffs 
          .Where(steam => steam.Label == "pirate") 
          .ToArray(); 

AttributeValue[] associated = xfile.AttributeValues 
            .Where(av => pirates.Any(pirate => pirate.ID == av.ObjectID)) 
            .ToArray(); 

// write to new file 
XElement fragments = new XElement(xfile.Namespace + "fragments"); 
foreach(SteamStuff steamStuff in pirates) 
    fragments.Add(steamStuff.Element); 
foreach(AttributeValue value in associated) 
    fragments.Add(value.Element); 

fragments.Save("fragment_file.xml"); 

Edit: Расширения файлов настраивается на пространство имен 'по умолчанию'.

+0

много ошибок я получаю, дайте мне перепроверять работу – Henric

Смежные вопросы