如何在 C# 中检索 XML 实体值?
我希望能够在 C#/.NET 4.0 应用程序中显示实体名称和值的列表。
我可以使用 XmlDocument.DocumentType.Entities 轻松检索实体名称,但是有没有一种好的方法来检索这些实体的值?
我注意到我可以使用 InnerText
检索纯文本实体的值,但这不适用于包含 XML 标记的实体。
求助于正则表达式的最佳方法是?
假设我有一个这样的文档:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document [
<!ENTITY test "<para>only a test</para>">
<!ENTITY wwwc "World Wide Web Corporation">
<!ENTITY copy "©">
]>
<document>
<!-- The following image is the World Wide Web Corporation logo. -->
<graphics image="logo" alternative="&wwwc; Logo"/>
</document>
我想向用户呈现一个列表,其中包含三个实体名称(test、wwwc 和 copy)及其值(名称后面的引号中的文本)。我没有考虑过嵌套在其他实体中的实体的问题,因此我对一种解决方案感兴趣,该解决方案既可以完全扩展实体值,也可以像引号中一样显示文本。
I want to be able to display a list of entity names and values in a C#/.NET 4.0 application.
I am able to retrieve the entity names easily enough using XmlDocument.DocumentType.Entities
, but is there a good way to retrieve the values of those entities?
I noticed that I can retrieve the value for text only entities using InnerText
, but this doesn't work for entities that contain XML tags.
Is the best way to resort to a regex?
Let's say that I have a document like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document [
<!ENTITY test "<para>only a test</para>">
<!ENTITY wwwc "World Wide Web Corporation">
<!ENTITY copy "©">
]>
<document>
<!-- The following image is the World Wide Web Corporation logo. -->
<graphics image="logo" alternative="&wwwc; Logo"/>
</document>
I want to present a list to the user containing the three entity names (test, wwwc, and copy), along with their values (the text in quotes following the name). I had not thought through the question of entities nested within other entities, so I would be interested in a solution that either completely expands the entity values or shows the text just as it is in the quotes.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
尽管这可能不是最优雅的解决方案,但我想出了一些似乎足以满足我的目的的解决方案。首先,我解析原始文档并从该文档中检索实体节点。然后,我创建了一个小的内存中 XML 文档,并向其中添加了所有实体节点。接下来,我添加了对临时 XML 中所有实体的实体引用。最后,我从所有引用中检索了 InnerXml。
这是一些示例代码:
Although it’s not likely the most elegant solution possible, I came up with something that seems to work well enough for my purposes. First, I parsed the original document and retrieved the entity nodes from that document. Then I created a small in-memory XML document, to which I added all the entity nodes. Next, I added entity references to all of the entities within the temporary XML. Finally, I retrieved the InnerXml from all of the references.
Here's some sample code:
这是一种方法(未经测试),它使用 XMLReader 和此类的 ResolveEntity() 方法:
This is one way (untested), it uses XMLReader and the ResolveEntity() method of this class:
如果您有一个
XmlDocument
对象,也许递归地单步执行每个XmlNode
对象(来自XmlDocument.ChildNodes
)会更容易,并且对于每个节点,您可以使用Name
属性来获取节点的名称。然后“获取值”取决于您想要的内容(InnerXml
用于字符串表示形式,ChildNodes
用于以编程方式访问XmlNode
对象,这些对象可以是转换为XmlEntity
/XmlAttribute
/XmlText
)。If you have an
XmlDocument
object, perhaps it would be easier to recursively step through eachXmlNode
object (fromXmlDocument.ChildNodes
), and for each node you can use theName
property to get the name of the node. Then "getting the value" depends on what you want (InnerXml
for a string representation,ChildNodes
for programmatic access to theXmlNode
objects which can be cast toXmlEntity
/XmlAttribute
/XmlText
).只需递归遍历树即可轻松显示 XML 文档的表示形式。
这个小类恰好使用控制台,但您可以轻松地根据需要对其进行修改。
使用该类很简单。下面是一个打印出当前配置文件的示例:
您自己尝试一下,您应该能够快速修改以获得您想要的内容。
You can easily display a representation of an XML document simply by walking the tree recursively.
This small class happens to use a Console, but you could easily modify it to your needs.
Using the class is trivial. Here is an example that prints out your current config file:
Try it for yourself, and you should be able to quickly modify to get what you want.
我在使用公认的解决方案时遇到了问题。特别是:
I ran into problems using the accepted solution. In particular: