我正在尝试使用XmlReader从输入中读取字符串 XML 片段,操作 XDocument 并将结果作为字符串输出。
如果存在对未知 XML 命名空间的引用,我只想保留该引用,而不是以任何方式修改。
注意我不知道可能的命名空间的列表,因此手动创建命名空间白名单不是一个选项。
我的目标是UWP平台,因此此处无法使用 XmlTextReader。
输入 XML 文档的示例:
<VisualState x:Name="Disabled">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="RootGrid">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}" />
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseMediumLowBrush}" />
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledTransparentBrush}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
Run Code Online (Sandbox Code Playgroud)
预期输出 XML 文档的示例:
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Target="RootGrid.Background" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}" />
<Setter Target="ContentPresenter.Foreground" Value="{ThemeResource SystemControlDisabledBaseMediumLowBrush}" />
<Setter Target="ContentPresenter.BorderBrush" Value="{ThemeResource SystemControlDisabledTransparentBrush}" />
</VisualState.Setters>
</VisualState>
Run Code Online (Sandbox Code Playgroud)
我当前用于解析 XML 的代码:
using (StringReader sr = new …Run Code Online (Sandbox Code Playgroud) 我需要解析一个xml文件,它实际上是一个非常大的树结构的图像,所以我使用XmlReader类来"动态"填充树.每个节点只通过ReadSubtree()函数从其父节点传递它所期望的xml块.这样做的好处是不必担心节点何时消耗了它的所有子节点.但现在我想知道这是否真的是一个好主意,因为可能有数千个节点,在阅读.NET源文件时,我发现每个ReadSubtree调用都会创建一对(可能更多)新对象,并且没有对可重用对象进行缓存(我已经看过).
也许ReadSubtree()不被认为是大量使用,或者我只是担心什么都没有,我只需要在解析文件后调用GC.Collect()...
希望有人可以对此有所了解.
提前致谢.
感谢您提供的精彩而富有洞察力的答案.
我深入研究了.NET源代码,发现它比我想象的要复杂得多.我终于放弃了在这种情况下调用此函数的想法.正如Stefan指出的那样,xml阅读器永远不会传递给局外人,我可以信任解析xml流的代码(由我自己编写),所以我宁愿强迫每个节点负责他们的数据量.从流中窃取比使用不那么精简的ReadSubtree()函数来保存几行代码.
我正在测试各种方法来读取(可能很大,非常频繁的读取)PHP配置文件.不需要写作.我有两个成功的实现,一个使用SimpleXML(我知道是一个DOM解析器)和一个使用XMLReader.
我知道DOM读取器必须读取整个树,因此使用更多内存.我的测试反映了这一点 我也知道SAX解析器是一个"基于事件"的解析器,它使用较少的内存,因为它从流中读取每个节点而不检查接下来的内容.
XMLReader还使用游标从流中读取,提供有关其当前所在节点的数据.所以,听起来像XMLReader(http://us2.php.net/xmlreader)并不是一个DOM解析器,但我的问题是,它是SAX解析器,还是其他什么?看起来XMLReader的行为与SAX解析器的行为方式相似,但不会自行抛出事件(换句话说,您可以使用XMLReader构建SAX解析器吗?)
如果它是别的,那么它的分类是否有名字?
我想重新使用我与.dad()的XML文件关联的StreamReader - 来自System.Xml.XmlReader的调用.
基本上我已经整理了一个小扩展方法,其中包含以下代码:
public static string GetValueByPath(this StreamReader str, string attributeName, params string[] nodes)
{
str.BaseStream.Position = 0;
XmlReader reader = XmlReader.Create(str);
// Stuff happens here now, not important for the question
}
Run Code Online (Sandbox Code Playgroud)
调用此扩展方法的StreamReader在整个Session中保持不变.
第一次这很好用,但如果我第二次使用这个方法,我会收到一个System.Xml-Exception.有没有办法有效地"重置"StreamReader?
谢谢,
丹尼斯
我过去曾使用HtmlAgilityPack来解析.Net中的HTML,但我不喜欢它只使用DOM模型的事实.
在大型文档和/或嵌套级别较高的文档上,可能会遇到堆栈溢出或内存不足异常.通常,基于DOM的解析模型比基于流的方法使用更多的内存,这通常是因为想要消费HTML的过程可能一次只需要几个元素可用.
有没有人知道.Net的一个像样的HTML解析器,它允许你以类似于XmlReader类的方式解析HTML ?即以前向流媒体方式
我需要从XmlReader获取完整的Xml字符串(长篇故事).但是,在此示例代码中,最终变量theXmlString保持为空.为什么不分配Xml字符串?
string xmlConfig = @"<pdfMappings>
<pdfFile formTypeEnum=""Int_UT_Additional_Investment_Form_Ind_And_LE_direct"">
<perspective ngiAdminPerspectiveName=""Investor"">
<fieldMapping fieldName=""topmostsubform[0].Page2[0].first_names[0]"" mapTo=""CurrentInvolvedParty.FirstName""></fieldMapping>
<fieldMapping fieldName=""topmostsubform[0].Page2[0].surname[0]"" mapTo=""CurrentInvolvedParty.LastName""></fieldMapping>
</perspective>
</pdfFile>
</pdfMappings>";
var reader = XmlReader.Create(new StringReader(xmlConfig));
string theXmlString = reader.ReadOuterXml();
Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用PHP和XMLReader解析一个非常大的XML文件,但似乎无法得到我正在寻找的结果.基本上,我正在搜索大量的信息,如果a包含某个zipcode,我想返回那一点XML,或继续搜索,直到找到该zipcode.从本质上讲,我将把这个大文件分解成只有几个小块,所以不必查看数千或数百万组信息,它可能是10或20.
这里有一些我喜欢的XML
//search through xml
<lineups country="USA">
//cache TX02217 as a variable
<headend headendId="TX02217">
//cache Grande Gables at The Terrace as a variable
<name>Grande Gables at The Terrace</name>
//cache Grande Communications as a variable
<mso msoId="17541">Grande Communications</mso>
<marketIds>
<marketId type="DMA">635</marketId>
</marketIds>
//check to see if any of the postal codes are equal to $pc variable that will be set in the php
<postalCodes>
<postalCode>11111</postalCode>
<postalCode>22222</postalCode>
<postalCode>33333</postalCode>
<postalCode>78746</postalCode>
</postalCodes>
//cache Austin to a variable
<location>Austin</location>
<lineup>
//cache all prgSvcID's to an …Run Code Online (Sandbox Code Playgroud) 我有这个XML文件:
<pack name="Cappellino" num_monete_livello="1100">
<level number="1" status="nolocked" />
<level number="2" status="locked" />
<level number="3" status="locked"/>
</pack>
<pack name="Canottiera">
<level number="4" status="locked"/>
<level number="5" status="locked"/>
<level number="6" status="locked"/>
<level number="7" status="locked"/>
</pack>
<pack name="Tuta">
<level number="8" status="locked"/>
<level number="9" status="locked"/>
<level number="10" status="locked"/>
</pack>
Run Code Online (Sandbox Code Playgroud)
要读取此文件,我使用以下代码:
XmlReader xml = new XmlReader();
XmlReader.Element xml_element = xml.parse(ProgressFileHandle);
Iterator iterator_level = xml_element.getChildrenByName("level").iterator();
while(iterator_level.hasNext()){
XmlReader.Element level_element = (XmlReader.Element)iterator_level.next();
String level_number = level_element.getAttribute("number");
String level_status = level_element.getAttribute("status");
}
Run Code Online (Sandbox Code Playgroud)
问题是代码只返回最后一个包,实际上该行XmlReader.Element xml_element = xml.parse(ProgressFileHandle);只返回给我:
<pack name="Tuta">
<level …Run Code Online (Sandbox Code Playgroud) 我想知道使用XmlReader读取XML在惯用的功能样式中会是什么样子.即如何处理作为有状态实体的XmlReader.有一个很好的例子吗?
我正在尝试使用XMLReaderFactory,但这已被弃用.现在,我如何创建XMLReader的实例?