现在,我意识到此前提出过这类问题(特别是这个 - 我认为这是对两个对象的非常好的描述).我的问题更多是围绕表现.我有几个XML文档,大小超过100 - 300 K. 我注意到将这些信息加载到一个XDocument而不是一个XmlDocument对象时会有一些延迟.这两个对象之间是否存在严重的性能差异?他们是否以不同方式访问XML的内容?使用XML字符串时,这是首选的,或者是有区别的.这些对象的最终用途是XPath在有问题的对象上运行查询(或LINQ,取决于).
同样,这主要是性能问题,涉及内存和速度.
目前我有以下代码:
XmlDocument xDoc = new XmlDocument();
xDoc.Load("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=twitter");
XmlNodeList tweets = xDoc.GetElementsByTagName("text");
foreach (int i in tweets)
{
if (tweets[i].InnerText.Length > 0)
{
MessageBox.Show(tweets[i].InnerText);
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,它给了我System.InvalidCastExceptionforeach线.
以下代码完美地工作(没有foreach,i被替换为零):
XmlDocument xDoc = new XmlDocument();
xDoc.Load("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=twitter");
XmlNodeList tweets = xDoc.GetElementsByTagName("text");
if (tweets[0].InnerText.Length > 0)
{
MessageBox.Show(tweets[0].InnerText);
}
Run Code Online (Sandbox Code Playgroud) 可以说我有以下xml(一个简单的例子)
<rows>
<row>
<name>one</name>
</row>
<row>
<name>two</name>
</row>
</rows>
Run Code Online (Sandbox Code Playgroud)
我试图通过使用XmlDocument和XPath解析这个(最终我可以创建行列表).
例如...
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
foreach(XmlNode row in doc.SelectNodes("//row"))
{
string rowName = row.SelectSingleNode("//name").InnerText;
}
Run Code Online (Sandbox Code Playgroud)
为什么,在我的foreach循环中,rowName总是"一个"?我希望它在第一次迭代时是"一个",在第二次迭代时是"两个".
似乎// name获取文档中的第一个实例,而不是我期望的行中的第一个实例.毕竟,我在"行"节点上调用该方法.如果这是"它是如何工作的"那么任何人都可以解释我如何改变它以满足我的需求?
谢谢
我正在尝试解析XML文档.有问题的文档是AppxManifest文件.
示例文档如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:build="http://schemas.microsoft.com/developer/appx/2012/build" IgnorableNamespaces="build">
<Identity Name="uytury" Publisher="hygj" Version="1.0.0.12" ProcessorArchitecture="neutral" />
<Properties>
<DisplayName>jhjj</DisplayName>
<PublisherDisplayName>bhhjb</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Prerequisites>
<OSMinVersion>6.2.1</OSMinVersion>
<OSMaxVersionTested>6.2.1</OSMaxVersionTested>
</Prerequisites>
<Resources>
<Resource Language="EN" />
</Resources>
<Applications>
<Application Id="App" Executable="gfg.exe" EntryPoint="gfg.App">
<VisualElements DisplayName="fdsf" Logo="Assets\Logo.png" SmallLogo="Assets\SmallLogo.png" Description="gfdsg" ForegroundText="light" BackgroundColor="#2672EC">
<DefaultTile ShowName="allLogos" WideLogo="Assets\WideLogo.png" ShortName="gfdsg" />
<SplashScreen Image="Assets\SplashScreen.png" BackgroundColor="#2672EC" />
<InitialRotationPreference>
<Rotation Preference="portrait" />
<Rotation Preference="landscape" />
<Rotation Preference="portraitFlipped" />
<Rotation Preference="landscapeFlipped" />
</InitialRotationPreference>
</VisualElements>
<Extensions>
<Extension Category="windows.search" />
<Extension Category="windows.shareTarget">
<ShareTarget>
<DataFormat>Text</DataFormat>
</ShareTarget>
</Extension>
</Extensions>
</Application>
</Applications>
<build:Metadata>
<build:Item …Run Code Online (Sandbox Code Playgroud) 为了返回SoapException.Detailasmx Web服务的有用信息,我从WCF中获取了一个想法,并创建了一个包含所述有用信息的错误类.然后将该故障对象序列化为XmlNode抛出所需的对象SoapException.
我想知道我是否有最好的代码来创建XmlDocument- 这是我对它的看法:
var xmlDocument = new XmlDocument();
var serializer = new XmlSerializer(typeof(T));
using (var stream = new MemoryStream())
{
serializer.Serialize(stream, theObjectContainingUsefulInformation);
stream.Flush();
stream.Seek(0, SeekOrigin.Begin);
xmlDocument.Load(stream);
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
更新:我实际上最终执行了以下操作,因为除非您将XML包装在<detail>xml元素中,否则您将SoapHeaderException在客户端获得:
var serialiseToDocument = new XmlDocument();
var serializer = new XmlSerializer(typeof(T));
using (var stream = new MemoryStream())
{
serializer.Serialize(stream, e.ExceptionContext);
stream.Flush();
stream.Seek(0, SeekOrigin.Begin);
serialiseToDocument.Load(stream);
}
// Remove the xml declaration
serialiseToDocument.RemoveChild(serialiseToDocument.FirstChild);
// Memorise the node we want
var …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下代码在XmlDocument中按名称查找节点:
private XmlNode FindNode(XmlNodeList list, string nodeName)
{
if (list.Count > 0)
{
foreach (XmlNode node in list)
{
if (node.Name.Equals(nodeName)) return node;
if (node.HasChildNodes) FindNode(node.ChildNodes, nodeName);
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
我用以下函数调用该函数:
FindNode(xmlDocument.ChildNodes, "somestring");
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它总是返回null,我不确定为什么.有人可以帮我解决这个问题吗?
我试图创建一个xml应该看起来像这样
<?xml version="1.0" encoding="iso-8859-1"?>
<MyTestSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Tests>
<Test>
<messaure>1</messaure>
<height>4</height>
</Test>
<Test>
<messaure>4</messaure>
<height>53</height>
</Test>
</Tests>
</MyTestSet>
Run Code Online (Sandbox Code Playgroud)
创建测试或测试元素不是问题,但创建包含命名空间的"MyTestSet"的最佳方法是什么?我使用c#XMLDocument
如果我想比较XMlDocument的内容,它是这样的吗?
XmlDocument doc1 = GetDoc1();
XmlDocument doc2 = GetDoc2();
if(doc1 == doc2)
{
}
Run Code Online (Sandbox Code Playgroud)
我不检查它们是否是相同的对象引用,但是如果xml的CONTENTS是相同的.
我知道remarks标签用于提供有关该类的其他信息,但在悬停/调用该类时它不会显示在intellisense中.我想知道它到底有用吗?
我有那个xml文件:
<?xml version="1.0" encoding="utf-8"?>
<reminders>
<reminder>
<Title>Alarm1</Title>
<Description>Desc1</Description>
<Time>03/07/2012 10:11AM</Time>
<snooze>1</snooze>
<repeat>None</repeat>
</reminder>
</reminders>
Run Code Online (Sandbox Code Playgroud)
我想将Alarm1中的innertext修改为另一个值,所以我编写了实际复制整个节点的代码.
XmlDocument xml = new XmlDocument();
xml.Load("0.xml");
XmlNodeList elements = xml.SelectNodes("//reminders");
foreach (XmlNode element in elements)
{
if (element.InnerText == "Alarm1")
{
XmlNode newvalue = xml.CreateElement("MODIFIED");
element.ReplaceChild(newvalue, element);
xml.Save("0.xml");
}
}
Run Code Online (Sandbox Code Playgroud)
然后尝试了另一个代码:
foreach (XmlElement element in xml.SelectNodes("//reminder"))
{
if (element.InnerText == "Alarm1")
{
XmlNode newvalue = xml.CreateElement("MODIFIED");
element.ReplaceChild(newvalue, element);
xml.Save("0.xml");
}
}
Run Code Online (Sandbox Code Playgroud)
但也不起作用....
编辑1:[找出新代码]
XmlDocument xml = new XmlDocument();
xml.Load("0.xml");
foreach (XmlElement element in xml.SelectNodes("//reminder"))
{ …Run Code Online (Sandbox Code Playgroud) xmldocument ×10
c# ×9
xml ×5
.net ×3
xpath ×2
equality ×1
foreach ×1
linq-to-xml ×1
performance ×1
xml-comments ×1