标签: linq-to-xml

在C#中使用XDocument创建XML文件

我有一个List<string>"sampleList",其中包含

Data1
Data2
Data3...
Run Code Online (Sandbox Code Playgroud)

文件结构就像

<file>
   <name filename="sample"/>
   <date modified ="  "/>
   <info>
     <data value="Data1"/> 
     <data value="Data2"/>
     <data value="Data3"/>
   </info>
</file>
Run Code Online (Sandbox Code Playgroud)

我目前正在使用XmlDocument来执行此操作.

例:

List<string> lst;
XmlDocument XD = new XmlDocument();
XmlElement root = XD.CreateElement("file");
XmlElement nm = XD.CreateElement("name");
nm.SetAttribute("filename", "Sample");
root.AppendChild(nm);
XmlElement date = XD.CreateElement("date");
date.SetAttribute("modified", DateTime.Now.ToString());
root.AppendChild(date);
XmlElement info = XD.CreateElement("info");
for (int i = 0; i < lst.Count; i++) 
{
    XmlElement da = XD.CreateElement("data");
    da.SetAttribute("value",lst[i]);
    info.AppendChild(da);
}
root.AppendChild(info);
XD.AppendChild(root);
XD.Save("Sample.xml");
Run Code Online (Sandbox Code Playgroud)

如何使用XDocument创建相同的XML结构?

c# xml linq-to-xml

78
推荐指数
1
解决办法
8万
查看次数

如何在XElement或LINQ中使用XPath?

考虑以下XML:

<response>
  <status_code>200</status_code>
  <status_txt>OK</status_txt>
  <data>
    <url>http://bit.ly/b47LVi</url>
    <hash>b47LVi</hash>
    <global_hash>9EJa3m</global_hash>
    <long_url>http://www.tumblr.com/docs/en/api#api_write</long_url>
    <new_hash>0</new_hash>
  </data>
</response>
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种非常简短的方法来获得<hash>元素的价值.我试过了:

var hash = xml.Element("hash").Value;
Run Code Online (Sandbox Code Playgroud)

但那不起作用.是否可以提供XPath查询XElement?我可以使用旧System.Xml框架来执行此操作,执行以下操作:

xml.Node("/response/data/hash").Value
Run Code Online (Sandbox Code Playgroud)

在LINQ命名空间中是否有这样的东西?


更新:

在对此进行了一些讨论之后,我找到了一种方法来做我正在尝试做的事情:

var hash = xml.Descendants("hash").FirstOrDefault().Value;
Run Code Online (Sandbox Code Playgroud)

我仍然有兴趣看看是否有人有更好的解决方案?

.net xml xelement xpath linq-to-xml

76
推荐指数
4
解决办法
6万
查看次数

':'字符,十六进制值0x3A,不能包含在名称中

我有一个包含其元素的xml文件

<ab:test>Str</ab:test>  
Run Code Online (Sandbox Code Playgroud)

当我尝试使用代码访问它时:

XElement tempElement = doc.Descendants(XName.Get("ab:test")).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误:

System.Web.Services.Protocols.SoapException:服务器无法处理请求.---> System.Xml.XmlException:':'字符,十六进制值0x3A,不能包含在名称中.

我该如何访问它?

c# xml linq linq-to-xml

73
推荐指数
5
解决办法
7万
查看次数

在不知道命名空间的情况下使用LINQ搜索XDocument

有没有办法在不知道命名空间的情况下搜索XDocument?我有一个记录所有SOAP请求并加密敏感数据的进程.我想根据名字找到任何元素.有点像,给我所有名称为CreditCard的元素.我不关心命名空间是什么.

我的问题似乎是LINQ并且需要一个xml命名空间.

我有其他从XML检索值的进程,但我知道这些其他进程的命名空间.

XDocument xDocument = XDocument.Load(@"C:\temp\Packet.xml");
XNamespace xNamespace = "http://CompanyName.AppName.Service.Contracts";

var elements = xDocument.Root
                        .DescendantsAndSelf()
                        .Elements()
                        .Where(d => d.Name == xNamespace + "CreditCardNumber");
Run Code Online (Sandbox Code Playgroud)

我真的希望能够在不知道名称空间的情况下搜索xml,如下所示:

XDocument xDocument = XDocument.Load(@"C:\temp\Packet.xml");
var elements = xDocument.Root
                        .DescendantsAndSelf()
                        .Elements()
                        .Where(d => d.Name == "CreditCardNumber")
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我在编译时事先不知道名称空间.

如何才能做到这一点?

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Request xmlns="http://CompanyName.AppName.Service.ContractA">
        <Person>
            <CreditCardNumber>83838</CreditCardNumber>
            <FirstName>Tom</FirstName>
            <LastName>Jackson</LastName>
        </Person>
        <Person>
            <CreditCardNumber>789875</CreditCardNumber>
            <FirstName>Chris</FirstName>
            <LastName>Smith</LastName>
        </Person>
        ...

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Request xmlns="http://CompanyName.AppName.Service.ContractsB">
        <Transaction>
            <CreditCardNumber>83838</CreditCardNumber>
            <TransactionID>64588</FirstName>
        </Transaction>      
        ...
Run Code Online (Sandbox Code Playgroud)

c# linq-to-xml

73
推荐指数
3
解决办法
6万
查看次数

如何从Xdocument获取Xml作为字符串

我是linq to XML的新手.在构建了XDocument之后,如何获得它的OuterXml,就像使用XmlDocument一样.

.net c# xml string linq-to-xml

66
推荐指数
4
解决办法
6万
查看次数

XElement的孩子

我如何才能获得XElement的孩子?

我目前正在使用XElement.Descendants()函数,它返回所有级别的XElements,而不仅仅是子节点.

我真正想要的只是孩子们的IEnumerable.

c# xml xelement linq-to-xml

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

如何在LINQ to XML中对元素进行深层复制?

我想制作一个LINQ to XML XElement的深层副本.我想这样做的原因是文档中有一些节点我想创建(在同一文档中)的修改副本.我没有看到这样做的方法.

我可以将元素转换为XML字符串然后重新解析它,但我想知道是否有更好的方法.

.net linq-to-xml

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

如何使用XDocument打印<?xml version ="1.0"?>

有没有办法让XDocument在使用ToString方法时打印xml版本?输出这样的东西:

<?xml version="1.0"?>
<!DOCTYPE ELMResponse [
]>
<Response>
<Error> ...
Run Code Online (Sandbox Code Playgroud)

我有以下内容:

var xdoc = new XDocument(new XDocumentType("Response", null, null, "\n"), ...
Run Code Online (Sandbox Code Playgroud)

这将打印出这个很好的,但它缺少如上所述的"<?xml版本".

<!DOCTYPE ELMResponse [
]>
<Response>
<Error> ...
Run Code Online (Sandbox Code Playgroud)

我知道你可以通过手动输出我自己来做到这一点.只是想知道是否可以使用XDocument.

c# xml linq-to-xml

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

如何更改XML属性

如何使用C#更改XML文件中元素的属性?

c# xml xmldocument linq-to-xml

60
推荐指数
3
解决办法
12万
查看次数

将Linq to Xml与Xml命名空间一起使用

我有这个代码:

/*string theXml =
@"<Response xmlns=""http://myvalue.com""><Result xmlns:a=""http://schemas.datacontract.org/2004/07/My.Namespace"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""><a:TheBool>true</a:TheBool><a:TheId>1</a:TheId></Result></Response>";*/

string theXml = @"<Response><Result><TheBool>true</TheBool><TheId>1</TheId></Result></Response>";

XDocument xmlElements = XDocument.Parse(theXml);

var elements = from data in xmlElements.Descendants("Result")
               select new {
                            TheBool = (bool)data.Element("TheBool"),
                            TheId = (int)data.Element("TheId"),
                          };

foreach (var element in elements)
{
    Console.WriteLine(element.TheBool);
    Console.WriteLine(element.TheId);
}
Run Code Online (Sandbox Code Playgroud)

当我使用第一个值为xml时,结果为null,而对于第二个值,我有很好的值...

如何使用xmlns值将Linq用于Xml?

c# linq-to-xml xml-namespaces

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

标签 统计

linq-to-xml ×10

c# ×8

xml ×7

.net ×3

xelement ×2

linq ×1

string ×1

xml-namespaces ×1

xmldocument ×1

xpath ×1