要使用任意编码加载XML文件,我有以下代码:
Encoding encoding;
using (var reader = new XmlTextReader(filepath))
{
reader.MoveToContent();
encoding = reader.Encoding;
}
var settings = new XmlReaderSettings { NameTable = new NameTable() };
var xmlns = new XmlNamespaceManager(settings.NameTable);
var context = new XmlParserContext(null, xmlns, "", XmlSpace.Default,
encoding);
using (var reader = XmlReader.Create(filepath, settings, context))
{
return XElement.Load(reader);
}
Run Code Online (Sandbox Code Playgroud)
这有效,但打开文件两次似乎有点低效.是否有更好的方法来检测编码,以便我可以这样做:
1. Open file
2. Detect encoding
3. Read XML into an XElement
4. Close file
Run Code Online (Sandbox Code Playgroud) 我正在考虑这样的方法.如果这实际上可以这样工作,请告诉我:对于示例XML:
<Root>
<Node>
<SubEl1>abc</SubEl1>
<SubEl2>def</SubEl2>
<SubEl3>123</SubEl3>
<SubEl4>456</SubEl4>
</Node>
</Root>
Run Code Online (Sandbox Code Playgroud)
想要进入<Node>,循环检查节点/元素名称并获取它的值.像这样的东西,比如名字'SubEl1'对task1使用'abc',看到元素名称是'SubEl2'我做task2.必须检查所有子元素!
示例(不工作代码):
//looping through 'Node' children
switch(SubElName for 'Node element)
{
case : 'SubEl1'
//Do Task1 using the SubEl1's value/TextName ...
case: 'SubEl2'
//Task2 ...
...
case: default //Do default task.....
}
//end loop
Run Code Online (Sandbox Code Playgroud)
如果你能想到任何其他方法(XElement,XmlDocument,SelectNodes()等,那也将受到赞赏!
我似乎无法XDocument.Descendants ()在文档中找到任何其他内容.有没有办法做到这一点?
我想读一个大的xml文件(100 + M).由于它的大小,我不想使用XElement将其加载到内存中.我正在使用linq-xml查询来解析和读取它.
最好的方法是什么?关于XPath或XmlReader与linq-xml/XElement组合的任何示例?
请帮忙.谢谢.
XElement.Save 实际上做我需要的,但它启动文件:
<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)
有办法防止这种情况吗?
在完成创建后,我应该使用其他类型,方法保存XElement吗?
或者我应该跳过那条线XmlReader.Read?因为这样做我觉得它更脆弱,因为我假设第一行总是这个xml声明.
实现这一目标的最简单方法是什么?
鉴于这样的事情:
var results = theElement.Element("Blah").Element("Whatever").Elements("Something");
Run Code Online (Sandbox Code Playgroud)
是否有一种优雅的方法来处理null Blah或Whatever元素,因此在这些情况下结果只是null或空?
我知道我可以拆分查询并手动进行这些检查但是想知道是否有更简洁的东西.
我有一个XElement像这样的内容.
<Response xmlns="someurl" xmlnsLi="thew3url">
<ErrorCode></ErrorCode>
<Status>Success</Status>
<Result>
<Manufacturer>
<ManufacturerID>46</ManufacturerID>
<ManufacturerName>APPLE</ManufacturerName>
</Manufacturer>
//More Manufacturer Elements like above here
</Result>
</Response>
Run Code Online (Sandbox Code Playgroud)
我将如何读取Status元素内部的值?
我试过 XElement stats = myXel.Descendants("Status").SingleOrDefault(); 但是返回null.
我有两个XElement实例:
var el1 = new System.Xml.Linq.XElement("xel", null);
var el2 = new System.Xml.Linq.XElement("xel", string.Empty);
Run Code Online (Sandbox Code Playgroud)
el1 看起来像这样:
<xel />
Run Code Online (Sandbox Code Playgroud)
el2 看起来像这样:
<xel></xel>
Run Code Online (Sandbox Code Playgroud)
然而,两者的Value属性相等.string.Empty
我能想到很多黑客来区分的null,从string.Empty在XElement,但有一些内置的框架,要做到这一点,我很想念?
我很难从XElement的innertext中获取正确的值.首先,这是我正在使用的XML.这是我们的工作流程中的流程产生的生产数据的副本.换句话说,我无法更改XML,我只能解析它.我想要获得的innertext元素内部的数据看起来像XML,但事实并非如此.它是生成XML的工具的直接文本.该元素称为<creatorshapeutildata:

这是我尝试过的代码行:
CreatorShapeUtilData = element.Descendants("creatorshapeutildata").Single().Value;
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
CreatorShapeUtilData = element.Descendants("creatorshapeutildata").First().Value;
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
CreatorShapeUtilData = element.Element("creatorshapeutildata").Value;
Run Code Online (Sandbox Code Playgroud)
不幸的是,在每种情况下返回的值如下所示:
33012-1true#FFFF003#FFFFFF2743337743358
我需要返回的值如下所示:
"<creatorData type="object"><type type="int">33012</type>..."
Run Code Online (Sandbox Code Playgroud)
我正在处理的这个部分是使用XDocument,XElement等的更大程序的一部分.我知道XmlElement有一个InnerText属性,但我认为XElement没有,因为我似乎无法在Intellisense中找到它.
那么,有没有可能的方法来获取creatorshapeutil标签之间的确切文本?
如何从XElement中删除"xmlns"命名空间?
我试过:attributes.remove,xElement.Name.NameSpace.Remove(0)等等.没有成功.
我的xml:
<event xmlns="http://www.blablabla.com/bla" version="1.00">
<retEvent version="1.00">
</retEvent>
</event>
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
xelement ×10
c# ×6
linq-to-xml ×6
xml ×4
.net ×3
linq ×2
xmlreader ×2
c#-4.0 ×1
encoding ×1
large-files ×1
selectnodes ×1
xmldocument ×1
xpath ×1