我有一个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结构?
考虑以下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)
我仍然有兴趣看看是否有人有更好的解决方案?
我有一个包含其元素的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,不能包含在名称中.
我该如何访问它?
有没有办法在不知道命名空间的情况下搜索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) 我是linq to XML的新手.在构建了XDocument之后,如何获得它的OuterXml,就像使用XmlDocument一样.
我如何才能获得XElement的孩子?
我目前正在使用XElement.Descendants()函数,它返回所有级别的XElements,而不仅仅是子节点.
我真正想要的只是孩子们的IEnumerable.
我想制作一个LINQ to XML XElement的深层副本.我想这样做的原因是文档中有一些节点我想创建(在同一文档中)的修改副本.我没有看到这样做的方法.
我可以将元素转换为XML字符串然后重新解析它,但我想知道是否有更好的方法.
有没有办法让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.
我有这个代码:
/*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?