标签: linq-to-xml

C#与IEnumerable <T>的区别在于自定义IEqualityComparer

这就是我想要做的.我正在使用LINQ to XML查询XML文件,它为我提供了一个IEnumerable <T>对象,其中T是我的"Village"类,填充了此查询的结果.有些结果是重复的,所以我想在IEnumerable对象上执行Distinct(),如下所示:

public IEnumerable<Village> GetAllAlliances()
{
    try
    {
        IEnumerable<Village> alliances =
             from alliance in xmlDoc.Elements("Village")
             where alliance.Element("AllianceName").Value != String.Empty
             orderby alliance.Element("AllianceName").Value
             select new Village
             {
                 AllianceName = alliance.Element("AllianceName").Value
             };

        // TODO: make it work...
        return alliances.Distinct(new AllianceComparer());
    }
    catch (Exception ex)
    {
        throw new Exception("GetAllAlliances", ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于默认的比较器不适用于Village对象,我实现了一个自定义的比较器,如AllianceComparer类中所示:

public class AllianceComparer : IEqualityComparer<Village>
{
    #region IEqualityComparer<Village> Members
    bool IEqualityComparer<Village>.Equals(Village x, Village y)
    {
        // Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) …
Run Code Online (Sandbox Code Playgroud)

c# ienumerable distinct linq-to-xml

52
推荐指数
3
解决办法
4万
查看次数

在XDocument中查找元素?

我有一个简单的XML

<AllBands>
  <Band>
    <Beatles ID="1234" started="1962">greatest Band<![CDATA[lalala]]></Beatles>
    <Last>1</Last>
    <Salary>2</Salary>
  </Band>
  <Band>
    <Doors ID="222" started="1968">regular Band<![CDATA[lalala]]></Doors>
    <Last>1</Last>
    <Salary>2</Salary>
  </Band>
</AllBands>
Run Code Online (Sandbox Code Playgroud)

但是,

当我想要到达"门乐队"并更改其ID时:

  using (var stream = new StringReader(result))
            {
                XDocument xmlFile = XDocument.Load(stream);

                var query = from c in xmlFile.Elements("Band")

                            select c;
                             ...
Run Code Online (Sandbox Code Playgroud)

query 没有结果

如果我xmlFile.Elements().Elements("Band")这样写 ,它会找到它.

问题是什么 ?

需要来自Root的完整路径吗?

如果是这样,为什么它没有指定就可以工作AllBands

XDocument导航是否要求我知道所需元素的完整级别结构?

.net c# xml linq-to-xml

49
推荐指数
5
解决办法
13万
查看次数

如何使用LINQ-to-XML选择特定节点

我可以选择第一个客户节点并使用下面的代码更改其公司名称.

但是如何选择ID = 2的客户节点?

    XDocument xmldoc = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"),
        new XComment("These are all the customers transfered from the database."),
        new XElement("Customers",
            new XElement("Customer",
                new XAttribute("ID", 1),
                new XElement("FullName", "Jim Tester"),
                new XElement("Title", "Developer"),
                new XElement("Company", "Apple Inc.")
                ),
            new XElement("Customer",
                new XAttribute("ID", 2),
                new XElement("FullName", "John Testly"),
                new XElement("Title", "Tester"),
                new XElement("Company", "Google")
                )
            )
        );

    XElement elementToChange = xmldoc.Element("Customers").Element("Customer").Element("Company");
    elementToChange.ReplaceWith(new XElement("Company", "new company value..."));
Run Code Online (Sandbox Code Playgroud)

回答:

谢谢大家,为了记录,这里是在customer-with-id-2元素中搜索company元素的确切语法,然后只更改company元素的值:

XElement elementToChange = xmldoc.Element("Customers")
    .Elements("Customer")
    .Single(x => (int)x.Attribute("ID") == …
Run Code Online (Sandbox Code Playgroud)

c# linq-to-xml

48
推荐指数
1
解决办法
11万
查看次数

linq问题:查询嵌套集合

我有一个Question类,它有公共List属性,可以包含几个Answers.

我有一个问题库,负责从xml文件中读取问题及其答案.

所以我有一个问题(列表)的集合,每个问题对象都有一个答案集合,我想通过使用Linq查询这个问题集合的答案(即其名称).我不知道如何正确地做到这一点.

我可以用foreach做这件事,但我想知道自从我学习它以来是否有纯粹的Linq方式.

.net c# linq collections linq-to-xml

47
推荐指数
4
解决办法
5万
查看次数

包含名称空间的XDocument

我有以下XML,我试图用XDocument查询:

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
        <EventID>589828</EventID>
        <Type>3</Type>
        <SubType Name="Information">0</SubType>
        <Level>8</Level>
        <TimeCreated SystemTime="2010-06-01T09:45:15.8102117Z" />
        <Source Name="System.ServiceModel" />
        <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
        <Execution ProcessName="w3wp" ProcessID="5012" ThreadID="5" />
        <Channel />
        <Computer>TESTSERVER3A</Computer>
    </System>
    <ApplicationData>
        <TraceData>
            <DataItem>
                <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Information">
                    <TraceIdentifier>http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Activation.WebHostCompilation.aspx</TraceIdentifier>
                    <Description>Webhost compilation</Description>
                    <AppDomain>/LM/W3SVC/257188508/Root-1-129198591101343437</AppDomain>
                    <Source>System.ServiceModel.Activation.ServiceParser/39498779</Source>
                    <ExtendedData xmlns="http://schemas.microsoft.com/2006/08/ServiceModel/StringTraceRecord">
                        <VirtualPath>/Service.svc</VirtualPath>
                    </ExtendedData>
                </TraceRecord>
            </DataItem>
        </TraceData>
    </ApplicationData>
</E2ETraceEvent>
Run Code Online (Sandbox Code Playgroud)

除非我手动删除命名空间,否则执行以下代码会为xEl1返回null :

XDocument xDoc = XDocument.Parse(CurrentString);
XElement xEl1 = xDoc.Element("E2ETraceEvent");
XElement xEl2 = xEl1.Element("System");
XElement xEl3 = xEl2.Element("Correlation");
XAttribute xAtt1 = xEl3.Attribute("ActivityID");
String sValue = xAtt1.Value;
Run Code Online (Sandbox Code Playgroud)

你如何编写代码来提取XDocument中的Guid?

c# xml linq linq-to-xml xml-namespaces

43
推荐指数
2
解决办法
5万
查看次数

如何包装XElement的值![CDATA [***]]?

这是从.net使用XDocument时.

我觉得这可能有用......

xElement.Element(elementName).Value = new XCData(value).ToString();
Run Code Online (Sandbox Code Playgroud)

......但它就像这样......

<name>&lt;![CDATA[hello world]]&gt;</name>
Run Code Online (Sandbox Code Playgroud)

.net c# xml linq-to-xml

43
推荐指数
3
解决办法
2万
查看次数

了解Linq To Xml - Descendants没有返回结果

我是Linq2XML的新手,因为我编写了很多行来执行简单的操作,而在一个简单的项目中,我想尝试一下......

我和他一起工作了2个小时,我没有做到这一点:(

我真的,真的想回到XmlNode-code-like

任务:

  • 我将SOAP Action发送到ASMX服务,然后将响应作为XML获取
  • 我将XML解析为XDocument对象
  • 我试着得到一个节点列表......错!问题!

正如你从这个截图中看到的那样

替代文字http://www.balexandre.com/temp/2010-02-26_0038.png

我的XDocument有一个名为TransactionInformationType的节点,它是一个序列,我很简单想要获取所有并且只需要检索我需要的2个变量(你可以看到代码注释),然后选择c;

Watch窗口中,您可以看到

doc.Descendants("TransactionInformationType")
Run Code Online (Sandbox Code Playgroud)

什么都不返回,并且通过Text Visualizer中的XDocument的内容看,它确实存在!

有人想解释并帮助我通过这个巨大的墙吗?

谢谢!


添加

XDocument内容


回答

响应XML有

<gettransactionlistResponse xmlns="https://ssl.ditonlinebetalingssystem.dk/remote/payment">

我必须使用它作为命名空间!

事实证明,要检索值,我还需要使用XNamespace,所以最终的代码如下所示:

// Parse XML
XDocument doc = XDocument.Parse(strResponse);
XNamespace ns = "https://ssl.ditonlinebetalingssystem.dk/remote/payment";

var trans = from item in doc.Descendants(ns + "TransactionInformationType")
            select new TransactionInformationType
            {
                capturedamount = Convert.ToInt32(item.Element(ns + "capturedamount").Value),
                orderid = item.Element(ns + "cardtypeid").Value
            };
Run Code Online (Sandbox Code Playgroud)

谢谢大家的帮助!

c# linq-to-xml

41
推荐指数
2
解决办法
2万
查看次数

将XDocument转换为Stream

如何将XDocument中的XML转换为MemoryStream,而不将任何内容保存到磁盘?

.net c# xml linq-to-xml

39
推荐指数
2
解决办法
4万
查看次数

如何从XDocument获取NameTable?

如何从XDocument获取NameTable?

它似乎没有XmlDocument具有的NameTable属性.

编辑:从缺乏答案来判断,我猜我可能会忽略这一点.

我正在对像这样的XDocument进行XPath查询...

document.XPathSelectElements("//xx:Name", namespaceManager);
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我必须手动将我想要使用的命名空间添加到XmlNamespaceManager,而不是像使用XmlDocument一样从XDocument中检索现有的命名表.

c# xml xpath linq-to-xml

38
推荐指数
3
解决办法
2万
查看次数

XDocument:将XML保存到没有BOM的文件

我正在使用生成utf-8 XML文件XDocument.

XDocument xml_document = new XDocument(
                    new XDeclaration("1.0", "utf-8", null),
                    new XElement(ROOT_NAME,                    
                    new XAttribute("note", note)
                )
            );
...
xml_document.Save(@file_path);
Run Code Online (Sandbox Code Playgroud)

正确生成文件并使用xsd文件成功验证.

当我尝试将XML文件上传到在线服务时,该服务说我的文件是wrong at line 1; 我发现问题是由文件的第一个字节上的BOM引起的.

你知道为什么将BOM附加到文件中,如何在没有它的情况下保存文件?

字节顺序标记维基百科文章中所述:

虽然Unicode标准允许使用UTF-8的BOM, 但它不需要或推荐它.字节顺序在UTF-8中没有意义,因此BOM仅用于将文本流或文件标识为UTF-8或者是从具有BOM的另一种格式转换的

这是一个XDocument问题还是我应该联系在线服务提供商的人员要求解析器升级?

c# byte-order-mark linq-to-xml

38
推荐指数
2
解决办法
3万
查看次数