查询XML文件,然后输出到新的XML文件 [英] Query XML file and then output to new XML file

查看:116
本文介绍了查询XML文件,然后输出到新的XML文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好

我有个问题.我试图弄清楚如何查询XML文件,然后使用结果创建新的XML.这就是我所拥有的.

原始文件类似于以下内容:

Hello All

I have a problem. I''m trying to figure out how to query an XML file and then create a new XML with the results. This is what I have.

The original file looks similar to this:

<?xml version="1.0"?>
<TopNode>
    <event uid="{AS1}">
        <vertex Lat="13.33" Lon="46.33"/>
        <vertex Lat="14.44" Lon="46.44"/>
        <vertex Lat="15.55" Lon="46.55"/>
        <vertex Lat="16.66" Lon="46.66"/>
    <event uid="{AS2}">
        <vertex Lat="23.33" Lon="56.33"/>
        <vertex Lat="24.44" Lon="56.44"/>
        <vertex Lat="25.55" Lon="56.55"/>
        <vertex Lat="26.66" Lon="56.66"/>
    <event uid="{AS3}">
        <vertex Lat="33.33" Lon="66.33"/>
        <vertex Lat="34.44" Lon="66.44"/>
        <vertex Lat="35.55" Lon="66.55"/>
        <vertex Lat="36.66" Lon="66.66"/>
    <event uid="{AS4}">
        <vertex Lat="43.33" Lon="76.33"/>
        <vertex Lat="44.44" Lon="76.44"/>
        <vertex Lat="45.55" Lon="76.55"/>
        <vertex Lat="46.66" Lon="76.66"/>
</TopNode>



我正在尝试从C#CheckedListBox设置一个查询,该查询将具有AS1,AS2,AS3,AS4的列表.我想要检查AS2和AS4是否将与检查内容相关的所有内容推送到新的XML文档中,然后将其保存为新名称.



I''m trying to set up a query from C# CheckedListBox that would have the list of AS1, AS2, AS3, AS4. I want if I have AS2 and AS4 checked that everything associated with what is checked gets pushed to a new XML document that would look like this and then saved with a new name.

<?xml version="1.0"?>
<TopNode>
    <event uid="{AS2}">
        <vertex Lat="23.33" Lon="56.33"/>
        <vertex Lat="24.44" Lon="56.44"/>
        <vertex Lat="25.55" Lon="56.55"/>
        <vertex Lat="26.66" Lon="56.66"/>
    <event uid="{AS4}">
        <vertex Lat="43.33" Lon="76.33"/>
        <vertex Lat="44.44" Lon="76.44"/>
        <vertex Lat="45.55" Lon="76.55"/>
        <vertex Lat="46.66" Lon="76.66"/>
</TopNode>



我知道这是有可能的,但我的想法是空白.任何帮助将非常感激.

谢谢



I know this is all possible but my mind is blank on the idea. Any help would be much appreciated.

Thanks

推荐答案

我认为可以使用XElementIEnumerableWhere 扩展方法来获得所需的结果,如下所示:
I think the required result can be obtained using the Where extension method of IEnumerable of XElement, as shown below:
string xmlData = @"<?xml version=""1.0""?>
                    <TopNode>
                        <event uid=""{AS1}"">
                            <vertex Lat=""13.33"" Lon=""46.33""/>
                            <vertex Lat=""14.44"" Lon=""46.44""/>
                            <vertex Lat=""15.55"" Lon=""46.55""/>
                            <vertex Lat=""16.66"" Lon=""46.66""/>
                        </event>
                        <event uid=""{AS2}"">
                            <vertex Lat=""23.33"" Lon=""56.33""/>
                            <vertex Lat=""24.44"" Lon=""56.44""/>
                            <vertex Lat=""25.55"" Lon=""56.55""/>
                            <vertex Lat=""26.66"" Lon=""56.66""/>
                        </event>
                        <event uid=""{AS3}"">
                            <vertex Lat=""33.33"" Lon=""66.33""/>
                            <vertex Lat=""34.44"" Lon=""66.44""/>
                            <vertex Lat=""35.55"" Lon=""66.55""/>
                        <vertex Lat=""36.66"" Lon=""66.66""/>
                        </event>
                        <event uid=""{AS4}"">
                            <vertex Lat=""43.33"" Lon=""76.33""/>
                            <vertex Lat=""44.44"" Lon=""76.44""/>
                            <vertex Lat=""45.55"" Lon=""76.55""/>
                            <vertex Lat=""46.66"" Lon=""76.66""/>
                        </event>
                    </TopNode>";
XDocument xdoc = XDocument.Parse(xmlData);
var requiredAttValues = new string[] {"{AS2}","{AS4}"};
var requiredElements = xdoc.Root.Elements().Where (r =>
    requiredAttValues.Contains(r.Attribute("uid").Value));

var partDoc =new XDocument (
    new XDeclaration ("1.0", "utf-8", "no"));
var root = new XElement("TopNode");
root.Add(requiredElements);
partDoc.Add(root);
partDoc.Save(outFileName);

//Contents of the output file
//<?xml version="1.0" encoding="utf-8" standalone="no"?>
//<TopNode>
//  <event uid="{AS2}">
//  <vertex Lat="23.33" Lon="56.33" />
//  <vertex Lat="24.44" Lon="56.44" />
//  <vertex Lat="25.55" Lon="56.55" />
//  <vertex Lat="26.66" Lon="56.66" />
//  </event>
//  <event uid="{AS4}">
//  <vertex Lat="43.33" Lon="76.33" />
//  <vertex Lat="44.44" Lon="76.44" />
//  <vertex Lat="45.55" Lon="76.55" />
//  <vertex Lat="46.66" Lon="76.66" />
//  </event>
//</TopNode>


这是我为您提供的非常简单的解决方案.首先将readxml数据放入数据表中,然后使用dataview过滤所需的数据.并将此dataview数据放到一个数据表中,而不是简单地创建xml文件.这是一个简单的例子

here is very simple solution that i am giving you. first readxml data and put into a datatable than using dataview filter the data as you want. and put this dataview data into a datatable than this datatale simply creat xml file. here is simple example

private void ReadxmlFromXml(string file_Path)
    {
        DataSet DS= new DataSet();     
        FileInfo FInfo = new FileInfo(file_Path);
        if (FInfo.Exists)
        {
            System.Xml.XmlTextReader xmlReader = new System.Xml.XmlTextReader(FInfo.FullName);
            xmlReader.WhitespaceHandling = WhitespaceHandling.None;
            try
            {
                DS.ReadXml(xmlReader);

DataView dv = ds.Tables[0].DefaultView;
dv.RowFilter = "your condtition";
DataTable dtEx = dv.ToTable();

DataSet DS1= new DataSet(); 
DS1.Merge(dtEx);

string newxml=DS1.GetXml();
//--- now write code for save this xmlstring to file


            }
            catch (Exception ex)
            {
            }
            finally
            {
            }

        }
    }


这篇关于查询XML文件,然后输出到新的XML文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆